que no puedo comentar, sin embargo, así que tengo que añadir esto como una respuesta.
Me gusta ser lo más específico posible, por eso prefiero incluir el tipo principal. Es por eso que voté la respuesta de Aaron.
El uso de DATABASE_PRINCIPAL_ID podría dar resultados inesperados si hay otro tipo de principal con el mismo nombre que la función que desea agregar. Esto se debe a que DATABASE_PRINCIPAL_ID devuelve el número de ID de principal en la base de datos actual, no específicamente para un principal con un tipo de función de base de datos.
Digamos que tiene un usuario con el mismo nombre que la función de base de datos. El estado del script de Yada indicaría éxito, pero no agregaría el rol porque ya existe un principal con ese nombre. Sin embargo, el guión de Aaron devolvería el siguiente error:
User, group, or role 'name' already exists in the current database.
prefiero coger este problema desde el principio (por ejemplo, cuando se ejecuta el script) que más adelante (por ejemplo, cuando se está utilizando mi aplicación).
Esto es lo que normalmente haría uso:
IF NOT EXISTS(SELECT NULL FROM sys.database_principals WHERE [name] = 'role_name' AND [type]='R')
BEGIN
-- add user;
END
Si realmente quiero para manejar esta situación y no mostrar un error, que podría utilizar algo como esto:
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
Consulte este enlace. Probablemente lo mismo que está buscando http://stackoverflow.com/questions/1201160/how-do-i-determine-if-a-database-role-exists-in-sql-server – madatanic
Posible duplicado de [Cómo Cómo determino si existe una función de base de datos en SQL Server?] (https://stackoverflow.com/questions/1201160/how-do-i-determine-if-a-database-role-exists-in-sql-server) –