пока не могу комментировать, так что я должен добавить это как ответ.
Мне нравится быть как можно более конкретным, поэтому я предпочитаю включать основной тип. Вот почему я проголосовал за ответ Аарона.
Использование 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
Пожалуйста, обратитесь к этой ссылке. Вероятно, то же самое, что вы ищете http://stackoverflow.com/questions/1201160/how-do-determine-if-a-database-role-exists-in-sql-server – madatanic
Возможный дубликат [How определить, существует ли роль базы данных в SQL Server?] (https://stackoverflow.com/questions/1201160/how-do-determine-if-a-database-role-exists-in-sql-server) –