2010-02-02 11 views
8

Quiero agregar usuarios en el mismo rol en más de una base de datos. Sin embargo, el rol puede/no puede estar presente en toda la base de datos. ¿Cómo puedo verificar si el rol existe en la base de datos y si agrega usuarios en ese rol?¿Verifica si existe papel en DB?

p. Ej. Si existe papel COMENZAR Añadir usuario en función FIN

+0

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

+0

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) –

Respuesta

15

intento:

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

Esto falla si tiene un usuario que tiene el mismo nombre de "rol" –

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

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 
0

Para especificar el base de datos que crearía la función en la que necesita utilizar

USE [DATABASE_NAME]; 

entonces usted podría continuar Ya da es la respuesta y será así

USE [DATABASE_NAME]; 
IF DATABASE_PRINCIPAL_ID('role') IS NULL 
BEGIN 
-- add user here 
CREATE ROLE role AUTHORIZATION MyUser; 
END 
Cuestiones relacionadas