这是我测试过的内容:
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
中是否存在用户?#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
评论
请记住,sys.database_principals包含角色和用户,因此一定不要忘记过滤用户。我正在针对当前标记的答案更新最终查询,以方便参考。