检查用户是否存在于 SQL Server 数据库中

Van*_*nel 42 sql-server sql-server-2012

我正在使用 SQL Server 2012。我想在将用户添加到数据库之前检查用户是否存在。

这是我测试过的:

USE [MyDatabase]
GO

IF NOT EXISTS (SELECT name 
                FROM [sys].[server_principals]
                WHERE name = N'IIS APPPOOL\MyWebApi AppPool')
Begin
    CREATE USER [IIS APPPOOL\MyWebApi AppPool] 
    FOR LOGIN [IIS APPPOOL\MyWebApi AppPool] WITH DEFAULT_SCHEMA=[dbo]
end
ALTER ROLE [db_owner] ADD MEMBER [IIS APPPOOL\MyWebApi AppPool]
GO
Run Code Online (Sandbox Code Playgroud)

但是,SELECT name FROM [sys].[server_principals]如果该用户存在于MyDatabase.

如何检查用户是否存在于MyDatabase

Chr*_*ich 38

使用sys.database_principals代替sys.server_principals

所以最终的查询看起来像这样(考虑到用户过滤器):

USE [MyDatabase]
GO

IF NOT EXISTS (SELECT [name]
                FROM [sys].[database_principals]
                WHERE [type] = N'S' AND [name] = N'IIS APPPOOL\MyWebApi AppPool')
Begin
    CREATE USER [IIS APPPOOL\MyWebApi AppPool] 
    FOR LOGIN [IIS APPPOOL\MyWebApi AppPool] WITH DEFAULT_SCHEMA=[dbo]
end
ALTER ROLE [db_owner] ADD MEMBER [IIS APPPOOL\MyWebApi AppPool]
GO
Run Code Online (Sandbox Code Playgroud)

  • 获得此(或其他对象存在检查)的快速方法是右键单击数据库对象并选择“DROP And CREATE TO”,这将生成正确的 IF NOT EXISTS 子句。 (2认同)
  • @Asher您必须在脚本设置中启用“检查对象存在”。 (2认同)

spa*_*dba 24

我将 SUSER_ID() 和 USER_ID() 用于此类事情:

-- Check SQL Server Login
IF SUSER_ID('SomeLogin') IS NULL
    CREATE LOGIN SomeLogin WITH PASSWORD = 'SomePassword';

-- Check database user
IF USER_ID('SomeUser') IS NULL
    CREATE USER SomeUser FOR LOGIN SomeLogin;
Run Code Online (Sandbox Code Playgroud)

  • 根据微软的建议 [https://docs.microsoft.com/en-us/sql/t-sql/functions/user-id-transact-sql],USER_ID 将在近期逐步淘汰,推荐功能改为使用 DATABASE_PRINCIPAL_ID [https://docs.microsoft.com/en-us/sql/t-sql/functions/database-principal-id-transact-sql] (4认同)

Moi*_*ala 15

进一步细化,因为这将使阅读更佳

USE [MyDatabase]
GO

IF DATABASE_PRINCIPAL_ID('IIS APPPOOL\MyWebApi AppPool') IS NULL
BEGIN
    CREATE USER [IIS APPPOOL\MyWebApi AppPool] 
    FOR LOGIN [IIS APPPOOL\MyWebApi AppPool] WITH DEFAULT_SCHEMA=[dbo]
END
ALTER ROLE [db_owner] ADD MEMBER [IIS APPPOOL\MyWebApi AppPool]
GO
Run Code Online (Sandbox Code Playgroud)