2013-09-16 4 views
4

В настоящее время я работаю с SQL Server 2008 R2, и у меня есть только READ доступ к нескольким таблицам, в которых хранятся данные о производстве.Разрешения на обновление SQL Server

Я нахожу, что во многих случаях, это было бы очень хорошо, если бы я мог запустить что-то вроде следующего, и получить общий рекорд отсчитать назад, что повлияло:

USE DB 
GO 

BEGIN TRANSACTION 
UPDATE Person 
SET pType = 'retailer' 
WHERE pTrackId = 20 
AND pWebId LIKE 'rtlr%'; 

ROLLBACK TRANSACTION 

Однако, видя, как я не имеют UPDATE разрешения, я не могу успешно запустить этот скрипт без получения:

Msg 229, Level 14, State 5, Line 5 
The UPDATE permission was denied on the object 'Person', database 'DB', schema 'dbo'. 

Мои вопросы:

  • Есть ли способ, что мой счет в SQL Server можно настроить таким образом, что если я хочу, чтобы запустить UPDATE скрипт, он автоматически будет обернут в транзакции с откатом (поэтому данные фактически не влияет)

Я знаю, что могу сделать копию этих данных и запустить свой сценарий против локального экземпляра SSMS, но мне интересно, есть ли способ для этого.

+0

Я отредактировал мой вопрос будет более сосредоточенным вокруг решения на основе пользовательского разрешения. Я бы хотел, чтобы наша ИТ-команда могла выполнить тот же самый запрос, но на самом деле это повлияло на набор данных ... если просто нет способа сделать это, тогда этого будет достаточно в качестве ответа также. – X3074861X

ответ

3

Я не думаю, что есть способ обойти разрешения SQL Server. И я не думаю, что это хорошая идея для разработки в производственной базе данных. Было бы гораздо лучше иметь версию разработки базы данных, с которой вы работаете.


Если количество затронутых строк - это все, что вам нужно, вы можете запустить select вместо обновления.

Например:

select count(*) 
from Person 
where pTrackId = 20 
AND pWebId LIKE 'rtlr%'; 
+2

Когда вы извлекаете данные из производства, я также хочу добавить 'WITH (NOLOCK)' в 'FROM' – valverij

3

Если вы только после того, количество строк, которые будут затронуты этим обновлением, что бы такое же количество строк, которые в настоящее время соответствуют к статье WHERE.

Таким образом, вы можете просто запустить SELECT заявления, как например:

SELECT COUNT(pType) 
FROM Person WHERE pTrackId = 20 
AND pWebId LIKE 'rtlr%'; 

И вы получите в результате потенциальных ряды пострадавших.

+0

. Это будет только подсчет строк, где' pType' не равен NULL. В инструкции UPDATE нет такого условия, поэтому это может привести к некорректному результату. –

0

1.First Войти как администратор в SQLServer
2.Goto login-> Ваш name-> Проверьте роли.
3.IF у вас есть доступ на запись, тогда вы можете выполнить вышеуказанную задачу.
4.If не убедитесь, что вы предоставляете доступ к записи.

0

Если это строго необходимо попытаться сделать обновление, можно написать хранимую процедуру, принимая динамический SQL в виде строки (ваш UPDATE запроса) и обертывание динамического SQL в контексте транзакции, который затем отката. Затем вашей учетной записи может быть предоставлен доступ к этой хранимой процедуре.

Лично я считаю, что это ужасная идея, и невероятно опасно - некоторые запросы выходят из таких контекстов транзакций (например, ALTER TABLE). Возможно, вы сможете каким-то образом заблокировать их, но это все равно будет проблемой безопасности/аудита.

Я рекомендую писать запрос для подсчета соответствующих строк:

SELECT COUNT(*) 
FROM --tables 
WHERE --your where clause 
-- any other clauses here e.g. GROUP BY, HAVING ... 
+0

Если вы считаете, что добавление обновления в хранимый процесс является ужасной идеей, то, пожалуйста, не предлагайте этого. – valverij

+0

@valverij Это верный ответ - просто не я бы рекомендовал. Я дал причины, по которым я бы не рекомендовал его, надеясь, что люди смогут прийти к своим собственным выводам. Не говоря уже о том, что любой уважающий себя DBA не допустил бы такой вещи в своей производственной среде, поэтому я не думаю, что это произойдет. tl; dr: answer! = предложение IMO. – penguat

+0

Предложение динамического запроса на самом деле не работает. Разрешение EXECUTE не будет применяться к динамическому запросу, и вы все равно получите ту же ошибку о запрете разрешений. Попробуйте и убедитесь сами. –

Смежные вопросы