检查用户在数据库中的角色

时间:2019-03-15 16:06:01

标签: sql-server

因此,问题是: 如何设置查询以告诉我某个用户在数据库中是否具有特定角色? 我想到了这个:

SELECT @sql = 'USE [' + @nameDB + '];'
EXEC sp_sqlexec @sql
if (select COUNT(*) from sys.database_principals princ left join sys.database_permissions perm on perm.grantee_principal_id = princ.principal_id where name = 'User') = 0
    BEGIN
        SELECT @sql = 'USE [' + @nameDB + '];'
        EXEC sp_sqlexec @sql
        CREATE USER [User] FOR LOGIN [User]
        ALTER ROLE [db_datareader] ADD MEMBER [User]
    END

我想知道“用户”是否是一系列数据库的db_datareader。如果不是,请授予他该角色。问题在于USE并没有将我指向正确的数据库,而是停留在master上,因此IF块永远不会执行。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

这应该为您带来想要的结果,提供实际上是将用户名硬编码为[User]。如果不是,则需要进一步参数化查询并引用相关的对象名称:

DECLARE @nameDB sysname = N'YourDB';
DECLARE @SQL nvarchar(MAX);

SET @SQL = N'USE ' + QUOTENAME(@nameDB) + N';' + NCHAR(13) + NCHAR(10) +
           N'IF (DATABASE_PRINCIPAL_ID(N''User'') IS NULL) BEGIN' + NCHAR(13) + NCHAR(10) +
           N'    CREATE USER [User] FOR LOGIN [User];' + NCHAR(13) + NCHAR(10) +
           N'    ALTER ROLE db_datareader ADD MEMBER [User];' + NCHAR(13) + NCHAR(10) +
           N'END;';
PRINT @SQL; --Your best friend.
EXEC sp_executesql @SQL;

编辑:USER_ID已过时,我应该知道得更多。

用户的参数化版本示例:

DECLARE @nameDB sysname = N'YourDB';
DECLARE @User sysname = N'User'
DECLARE @SQL nvarchar(MAX);

SET @SQL = N'USE ' + QUOTENAME(@nameDB) + N';' + NCHAR(13) + NCHAR(10) +
           N'IF (DATABASE_PRINCIPAL_ID(@User) IS NULL BEGIN' + NCHAR(13) + NCHAR(10) +
           N'    CREATE USER ' + QUOTENAME(@User) + N' FOR LOGIN ' + QUOTENAME(@User) + N';' + NCHAR(13) + NCHAR(10) +
           N'    ALTER ROLE db_datareader ADD MEMBER ' + QUOTENAME(@User) + N';' + NCHAR(13) + NCHAR(10) +
           N'END;';
EXEC sp_executesql @SQL, N'@User sysname', @User = @User;