Проверьте роль пользователя в базе данных - PullRequest
0 голосов
/ 15 марта 2019

Итак, вопрос таков: как я могу настроить запрос, чтобы сообщить мне, играет ли определенный пользователь определенную роль в базе данных?Я придумал это:

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 не указывает мне на нужную базу данных, а привязывает к основному, поэтому блок IF никогда не выполняется.Есть предложения?

1 Ответ

0 голосов
/ 15 марта 2019

Это должно дать вам результат, которого вы добились, при условии имя пользователя фактически жестко закодировано в [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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...