web-dev-qa-db-ja.com

SQL Serverデータベースにユーザーが存在するかどうかを確認する

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に存在するかどうかを確認するにはどうすればよいですか?

33
VansFannel

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
29
Chris Aldrich

私はこの種のもののためにSUSER_ID()とUS​​ER_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;
17
spaghettidba

これにより、より最適な読み取りが可能になるため、さらに洗練されます。

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
12
Moiz Tankiwala

登録済みサーバーを使用している場合は、一度に多くのサーバーをチェックして、次のようにtrue/falseを返すことができます。

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