检查DB中是否存在角色?

时间:2010-02-02 14:52:19

标签: sql sql-server database permissions roles

我想在多个数据库中添加相同角色的用户。但是,该角色可以/不可以存在于所有数据库中。如何检查角色是否存在于数据库中以及是否确实添加了该角色的用户?

e.g。 IF角色存在 开始     添加用户角色 END

4 个答案:

答案 0 :(得分:15)

尝试:

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

答案 1 :(得分:7)

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

答案 2 :(得分:5)

我还不能发表评论,所以我必须补充一下作为答案。

我喜欢尽可能具体,这就是为什么我更喜欢包括主要类型。这就是我投票给Aaron答案的原因。

如果存在与要添加的角色同名的其他主体类型,则使用DATABASE_PRINCIPAL_ID可能会产生意外结果。这是因为DATABASE_PRINCIPAL_ID返回当前数据库中主体的ID号,而不是具有数据库角色类型的主体的ID号。

假设您有一个与数据库角色同名的用户。 Yada脚本的状态将表示成功,但它不会添加角色,因为已经有一个具有该名称的主体。但是,Aaron的脚本会返回以下错误:

  

用户,组或角色'name'已存在于当前数据库中。

我希望尽早(例如,当脚本运行时)比以后(例如,当我的应用程序正在使用时)捕获此问题。

以下是我通常使用的内容:

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

答案 3 :(得分:0)

要指定要在其中创建角色的数据库,您需要使用

k = 2

然后你可以继续Yada的答案,就像这样

k > 2