如何通过在存储过程中将数据库名称作为Input参数传递来设置用户权限?
Declare @username nvarchar(100)
Declare @databasename nvarchar(100)
set @username = 'ABC'
CREATE USER @username FOR LOGIN @username
ALTER ROLE [db_datareader] ADD Member @username
答案 0 :(得分:1)
Sean在注释中提到了安全性问题,但是,正如我提到的那样,您将需要动态SQL。我认为,在使用Dynamic SQL时,要确保做的最重要事情是正确地引用字符串,以确保最大程度地减少对Injection的暴露。不管您在这里做什么,总有其他问题。但是就像我说的那样,肖恩讲了这一点。
无论如何,这就是您要这样做的方式:
DECLARE @username sysname;
SET @username = N'ABC';
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'CREATE USER ' + QUOTENAME(@Username) + N' FOR LOGIN ' + QUOTENAME(@Username) N';' + NCHAR(10) +
N'ALTER ROLE db_datareader ADD MEMBER' + QUOTENAME(@Username) + N';';
PRINT @SQL; --Your "best" friend
EXEC sp_executesql @SQL;
如果确实需要,也可以在同一条语句中将此引用也设置为数据库,但是,这的确是个坏主意。