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

这是我测试过的内容:

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


但是,如果该用户存在于SELECT name FROM [sys].[server_principals]中,则此代码MyDatabase不会返回。

如何检查MyDatabase中是否存在用户?

评论

请记住,sys.database_principals包含角色和用户,因此一定不要忘记过滤用户。我正在针对当前标记的答案更新最终查询,以方便参考。

#1 楼

使用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


评论


一种快速的获取此方法(或其他对象是否存在检查)的方法是右键单击数据库对象,然后选择“ DROP And CREATE TO”,这将生成正确的IF NOT EXISTS子句。

– LowDBA-约翰·麦考尔(John McCall)
16年1月11日在14:36

@LowlyDBA在带有SSMS 18.5的MSSQL 2017中不起作用。没有“如果不存在”,只是单纯的拖放和创造。

–碎石机
20 Jun 15 '13:34



要考虑广告帐户,我将其更改为:WHERE [type] IN(N'S',N'U')

–碎石机
20年6月15日在13:55

@Asher您必须在脚本设置的“检查对象是否存在”中启用。

– LowDBA-约翰·麦考尔(John McCall)
20年6月15日在17:11

#2 楼

我将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;


评论


根据Microsoft的建议[docs.microsoft.com/en-us/sql/t-sql/functions/…,USER_ID将在不久的将来被淘汰,而推荐使用的功能是DATABASE_PRINCIPAL_ID [docs.microsoft.com / zh-CN / sql / t-sql / functions / ...

– Moiz Tankiwala
17年5月18日在0:24

链接断开。新链接:docs.microsoft.com/zh-cn/sql/t-sql/functions/…

–userM1433372
19年5月29日在11:11

#3 楼

进一步完善,因为这将使阅读效果更佳-

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


#4 楼

如果您使用的是注册服务器,则可以一次检查许多服务器,并使用以下命令返回true / false:

SELECT @@servername,    
    CASE 
        WHEN EXISTS(SELECT name FROM sys.database_principals WHERE name = 'LoginName') THEN 1 
        ELSE 0 
    END AS YesNo


评论


您可能需要更新答案,以提及database_principals而不是server_principals-检查问题-它与数据库级别的用户有关。

–Max Vernon♦
18-09-17在14:11