2009-06-18 50 views
3

在SQL Server 2005中,如何使用变量作为用户名来使用GRANT或DENY权限访问数据库对象?我曾尝试:在SQL Server 2005中与GRANT和DENY一起使用变量

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) 
1

在这种情况下将使用动态SQL工作?

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

只要记住保护代码免受SQL注入。 – 2009-06-18 12:51:02

+0

这将导致一个错误: 未能找到存储过程 'GRANT SELECT ON [MYTABLE] TO域\用户名' – SamWM 2009-06-18 12:52:58

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