2010-02-02 2 views
8

Я хочу добавить пользователей в одну и ту же роль в нескольких базах данных. Однако роль может/не может присутствовать во всей базе данных. Как я могу проверить, существует ли роль в базе данных, и добавляет ли она в эту роль пользователей?Проверьте, существует ли роль в БД?

например. ЕСЛИ роль существует НАЧАТЬ Добавить пользователя в роли КОНЦА

+0

Пожалуйста, обратитесь к этой ссылке. Вероятно, то же самое, что вы ищете http://stackoverflow.com/questions/1201160/how-do-determine-if-a-database-role-exists-in-sql-server – madatanic

+0

Возможный дубликат [How определить, существует ли роль базы данных в SQL Server?] (https://stackoverflow.com/questions/1201160/how-do-determine-if-a-database-role-exists-in-sql-server) –

ответ

15

попробовать:

IF DATABASE_PRINCIPAL_ID('role') IS NULL 
BEGIN 
    -- add user here 
    CREATE ROLE role AUTHORIZATION MyUser; 
END 
+0

Это не удается, если у вас есть пользователь, у которого есть одно и то же имя роли –

7
IF EXISTS 
(
    SELECT 1 
    FROM sys.database_principals 
    WHERE type_desc = 'DATABASE_ROLE' 
    AND name = 'name' 
) 
BEGIN 
    -- add user; 
END 
4

пока не могу комментировать, так что я должен добавить это как ответ.

Мне нравится быть как можно более конкретным, поэтому я предпочитаю включать основной тип. Вот почему я проголосовал за ответ Аарона.

Использование DATABASE_PRINCIPAL_ID может дать неожиданные результаты, если есть другой тип типа с тем же именем, что и роль, которую вы хотите добавить. Это связано с тем, что DATABASE_PRINCIPAL_ID возвращает идентификационный номер принципала в текущей базе данных, а не только для принципала с типом роли базы данных.

Предположим, что у вас есть пользователь с тем же именем, что и роль базы данных. Статус сценария Yada указывает на успех, но он не добавит этой роли, потому что с этим именем уже существует главный. Тем не менее, сценарий Аарона возвратит следующую ошибку:

User, group, or role 'name' already exists in the current database.

Я предпочел бы поймать эту проблему на ранней стадии (например, при выполнении сценария), чем позже (например, когда мое приложение используется).

Вот что я обычно использую:

IF NOT EXISTS(SELECT NULL FROM sys.database_principals WHERE [name] = 'role_name' AND [type]='R') 
BEGIN 
    -- add user; 
END 

Если я действительно хочу, чтобы справиться с этим сценарием и не показывать ошибку, я мог бы использовать что-то вроде этого:

DECLARE @RoleName sysname, 
     @PrincipalType NVARCHAR(60); 

SET @RoleName = 'role_name'; 
SET @PrincipalType = (SELECT type_desc FROM sys.database_principals WHERE [name] = @RoleName); 

IF @PrincipalType IS NULL 
BEGIN 
    -- Add user; 
END 
ELSE IF @PrincipalType <> 'DATABASE_ROLE' 
BEGIN 
    --Deal with the issue as desired. Here we're printing out a warning. Important: The status will still indicate that the Query executed successfully when using PRINT to show warnings. 
    PRINT 'WARNING: The ' + @RoleName + ' database role was not created. A principal already exists in the database with a type of ' + @PrincipalType + '.'; 
END 
0

Чтобы указать базу данных, которую вы должны создать в ней, вам необходимо использовать

USE [DATABASE_NAME]; 

Тогда вы можете продолжить Ya да ответ будет таким:

USE [DATABASE_NAME]; 
IF DATABASE_PRINCIPAL_ID('role') IS NULL 
BEGIN 
-- add user here 
CREATE ROLE role AUTHORIZATION MyUser; 
END 
Смежные вопросы