【问题标题】:Check if role exists in DB?检查数据库中是否存在角色?
【发布时间】:2011-01-12 04:42:22
【问题描述】:

我想将用户添加到多个数据库中的同一角色。但是,该角色可能存在也可能不存在于每个数据库中。如何检查每个数据库中是否存在该角色,如果存在,将用户添加到该角色?

例如 如果角色存在 开始 在角色中添加用户 结束

【问题讨论】:

标签: sql sql-server database permissions roles


【解决方案1】:

尝试:

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

【讨论】:

  • 如果您的用户碰巧具有相同的“角色”名称,则会失败
  • 请注意,元数据函数(如 DATABASE_PRINCIPAL_ID())在设计上会经常使用低级阻塞......
【解决方案2】:
IF EXISTS 
(
  SELECT 1
    FROM sys.database_principals
    WHERE type_desc = 'DATABASE_ROLE'
    AND name = 'name'
)
BEGIN
  -- add user;
END

【讨论】:

    【解决方案3】:

    我还不能发表评论,所以我必须添加这个作为答案。

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

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

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

    当前数据库中已存在用户、组或角色“名称”。

    我宁愿尽早发现这个问题(例如,当脚本运行时)而不是稍后(例如,当我的应用被使用时)。

    这是我通常使用的:

    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
    

    【讨论】:

      【解决方案4】:

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

      USE [DATABASE_NAME];
      

      那你可以继续雅达的答案,会是这样的

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-05
        • 2010-10-22
        • 2012-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多