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

问题描述 投票:0回答:1

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

Declare @username nvarchar(100)
Declare @databasename nvarchar(100)

set @username = 'ABC'

CREATE USER @username FOR LOGIN @username
ALTER ROLE [db_datareader] ADD Member @username
sql sql-server tsql
1个回答
1
投票

肖恩提到在评论中的安全问题,但是,正如我所说,你需要为这个动态SQL。在我看来,最重要的是要确保你使用动态SQL时,正确引用你的字符串,以确保曝光注射最小化。随着你在做什么在这里,还有其他的问题呢;但就像我说的,肖恩覆盖这一点。

无论如何,这是你会怎么做:

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;

如果你真的需要,你可以使这个参考数据库,以及在同一语句,但是,确实似乎像一个坏主意。

© www.soinside.com 2019 - 2024. All rights reserved.