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


28

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


1
sys.database_principalsにはロールとユーザーが一緒に含まれているため、ユーザーをフィルターすることを忘れないでください。簡単に参照できるように、現在マークされている回答に対して最終クエリを更新しています。
モイズタンキワラ17年

回答:


26

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

2
これ(または他のオブジェクトの存在チェック)をすばやく取得するには、データベースオブジェクトを右クリックし、「DROP And CREATE TO」を選択して、適切なIF NOT EXISTS句を生成します。
LowlyDBA

15

この種のことには、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;

4
Microsoftの推奨[ docs.microsoft.com/en-us/sql/t-sql/functions/…により、USER_IDは近い将来廃止され、代わりに使用する推奨機能はDATABASE_PRINCIPAL_ID [ docs.microsoft.com / en-us / sql / t-sql / functions /…
モイズタンキワラ

リンクが壊れています。新リンク:docs.microsoft.com/en-us/sql/t-sql/functions/...
userM1433372

9

これにより、さらに最適化され、より最適な読み取り

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

0

抵抗サーバーを使用している場合は、多数のサーバーを一度にチェックして、次のように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-質問を確認してください- データベースレベルのユーザーに関するものです。
マックスヴァーノン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.