2010-02-02 7 views
8

같은 역할의 사용자를 둘 이상의 데이터베이스에 추가하려고합니다. 그러나 역할은 모든 데이터베이스에 존재할 수 있습니다. 역할이 데이터베이스에 있는지, 그리고 역할에 사용자가 추가되는지 어떻게 확인할 수 있습니까?DB에 역할이 있는지 확인하십시오.

나는 아직 언급 할 수

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

이 링크를 참조하십시오. 아마도 당신이 찾고있는 똑같은 물건 http://stackoverflow.com/questions/1201160/how-do-i-determine-if-a-database-role-exists-in-sql-server – madatanic

+0

가능한 복제본 데이터베이스 역할이 SQL Server에 있는지 확인합니까?] (https://stackoverflow.com/questions/1201160/how-do-i-determine-if-a-database-role-exists-in-sql-server) –

답변

15

시도 사용자를 추가 시작합니다.

저는 가능한 한 구체적으로하고 싶은데, 이것이 내가 주체 유형을 선호하는 이유입니다. 이것이 내가 아론의 대답을 뽑은 이유입니다.

DATABASE_PRINCIPAL_ID를 사용하면 추가 할 역할과 이름이 같은 다른 주체 유형이있는 경우 예기치 않은 결과가 발생할 수 있습니다. 이는 DATABASE_PRINCIPAL_ID가 현재 데이터베이스의 의 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 

정말 오류를 표시하지이 시나리오를 처리하고 싶은 경우에, I는 다음과 같이 사용할 수 있습니다 :

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

동일한 "역할"이름을 가진 사용자가있는 경우 실패합니다. –

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

, 그래서 나는 대답으로이를 추가 할 수 있습니다 역할이있는 경우 는 역할 END에

0

이를 지정하려면 다음

내가 일반적으로 사용하는 것 무엇 당신이 사용해야하는 역할을 생성 할 데이터베이스

USE [DATABASE_NAME]; 

그런 다음 계속할 수 있습니다. 다가 대답은 이것과 같습니다.

USE [DATABASE_NAME]; 
IF DATABASE_PRINCIPAL_ID('role') IS NULL 
BEGIN 
-- add user here 
CREATE ROLE role AUTHORIZATION MyUser; 
END 
관련 문제