Sql 检查数据库中是否存在角色?

Sql 检查数据库中是否存在角色?,sql,sql-server,database,permissions,roles,Sql,Sql Server,Database,Permissions,Roles,我想向多个数据库中的同一角色添加用户。但是,该角色可能存在于每个数据库中,也可能不存在于每个数据库中。如何检查每个数据库中是否存在该角色,如果存在,如何向该角色添加用户 e、 g。 如果角色存在 开始 在角色中添加用户 结束尝试: IF DATABASE_PRINCIPAL_ID('role') IS NULL BEGIN -- add user here CREATE ROLE role AUTHORIZATION MyUser; END 我还不能评论,所以我必须补充这一点作为回答

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

e、 g。 如果角色存在 开始 在角色中添加用户 结束

尝试:

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

我还不能评论,所以我必须补充这一点作为回答

我喜欢尽可能具体,这就是为什么我更喜欢包含主体类型。这就是为什么我投票支持亚伦的答案

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

假设您有一个与数据库角色同名的用户。Yada脚本的状态将指示成功,但它不会添加角色,因为已经有一个具有该名称的主体。但是,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

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

USE [DATABASE_NAME];
然后你可以继续雅达的答案,它将是这样的

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

请参考此链接。如果您有一个恰好具有相同角色名的用户,那么您正在寻找的可能的重复项可能也会失败。注意,像DATABASE\u PRINCIPAL\u ID这样的元数据函数在设计上经常使用低级阻塞。。。。
USE [DATABASE_NAME];
IF DATABASE_PRINCIPAL_ID('role') IS NULL
BEGIN
-- add user here
CREATE ROLE role AUTHORIZATION MyUser;
END