2009-06-18 1 views
3

В SQL Server 2005 как вы можете использовать переменную для имени пользователя для разрешений GRANT или DENY для объектов с базой данных? Я пробовал:Использование переменных с GRANT и DENY в SQL Server 2005

DECLARE @username varchar(30) 
SET @username = 'DOMAIN\UserName' 
GRANT SELECT ON [mytable] TO @username 
GRANT UPDATE([field one], [field two], [field three]) ON [mytable] TO @username 

я Incorrect syntax near '@username', поэтому я завернул его в [и]

GRANT SELECT ON [mytable] TO [@username] 

Однако это затем приводит к Cannot find the user '@username', because it does not exist or you do not have permission. Как я могу это сделать без ввода имени пользователя для каждого оператора? Я хочу сделать это, чтобы уменьшить вероятность любой опечатки (что может привести к неправильному пользователю, получающему разрешения)

ответ

7

вам нужен динамический SQL, изменение EXEC для печати, если вы хотите увидеть, что будет выполнены добавлены функции quotename, потому что вам нужна скобка пользователей домена

DECLARE @username varchar(30) 
SET @username = 'DOMAIN\UserName' 

SET @username = quotename(@username) 

exec ('GRANT SELECT ON [mytable] TO ' + @username) 
exec ('GRANT UPDATE([field one], [field two], [field three]) ON [mytable] TO ' + @username) 
+0

Это отлично работает, спасибо. Нет необходимости в операторах SET @sql с этим – SamWM

1

Будет ли использовать динамический SQL-работу в этом случае?

DECLARE @sql VARCHAR(2000) 
SET @sql = 'GRANT SELECT ON [mytable] TO ' + @username 
EXEC @sql 
+0

Не забудьте защитить код от SQL-инъекции. –

+0

Это приводит к ошибке: Не удалось найти хранимую процедуру 'GRANT ВЫБРАТЬ ВКЛ [туЬаЫе] TO DOMAIN \ UserName' – SamWM

+0

вам нужно скобки, см мой ответ – SQLMenace

1

Обновления ответа от Yoopergeek, вы могли бы получить

DECLARE @sql VARCHAR(2000) 
SET @sql = 'GRANT SELECT ON [mytable] TO [' + Replace(@username, '[', '\[') + ']' + Char(13) + Char(10) 
SET @sql = 'GRANT UPDATE([field one], [field two], [field three]) ON [mytable] TO [' + Replace(@username, '[', '\[') + ']' 
PRINT @sql 
EXEC @sql 
Смежные вопросы