如何通过在存储过程中将数据库名称作为Input参数传递来设置用户权限?

时间:2019-02-05 20:12:21

标签: sql sql-server tsql

如何通过在存储过程中将数据库名称作为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

1 个答案:

答案 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;

如果确实需要,也可以在同一条语句中将此引用也设置为数据库,但是,这的确是个坏主意。