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
しかし、このコードSELECT name FROM [sys].[server_principals]
は、そのユーザーがMyDatabase
に存在する場合は返されません。
ユーザーがMyDatabase
に存在するかどうかを確認するにはどうすればよいですか?
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
私はこの種のもののために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;
これにより、より最適な読み取りが可能になるため、さらに洗練されます。
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
登録済みサーバーを使用している場合は、一度に多くのサーバーをチェックして、次のようにtrue/falseを返すことができます。
SELECT @@servername,
CASE
WHEN EXISTS(SELECT name FROM sys.database_principals WHERE name = 'LoginName') THEN 1
ELSE 0
END AS YesNo