Überprüfen Sie, ob ein Benutzer in einer SQL Server-Datenbank vorhanden ist

28

Ich arbeite mit SQL Server 2012. Ich möchte überprüfen, ob ein Benutzer vorhanden ist, bevor ich ihn einer Datenbank hinzufüge.

Das habe ich getestet:

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

Dieser Code wird SELECT name FROM [sys].[server_principals]jedoch nicht zurückgegeben, wenn dieser Benutzer in vorhanden ist MyDatabase.

Wie kann ich überprüfen, ob ein Benutzer in existiert MyDatabase?

VansFannel
quelle
1
Denken Sie daran, dass die sys.database_principals Rollen und Benutzer zusammen enthalten, sodass Sie nicht vergessen müssen, die Benutzer zu filtern. Ich aktualisiere die endgültige Abfrage anhand der aktuell markierten Antwort, um sie leichter nachschlagen zu können.
Moiz Tankiwala

Antworten:

26

Verwenden Sie sys.database_principalsanstelle von sys.server_principals.

Die endgültige Abfrage würde also so aussehen (Berücksichtigung des Benutzerfilters):

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
Chris Aldrich
quelle
2
Eine schnelle Möglichkeit, diese (oder eine andere Prüfung der Objektexistenz) zu erhalten, besteht darin, mit der rechten Maustaste auf ein Datenbankobjekt zu klicken und "DROP And CREATE TO" auszuwählen, wodurch die richtige IF NOT EXISTS-Klausel generiert wird.
LowlyDBA
15

Ich benutze SUSER_ID () und USER_ID () für diese Art von Dingen:

-- 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;
Spaghettidba
quelle
4
Gemäß der Empfehlung von Microsoft [ docs.microsoft.com/en-us/sql/t-sql/functions/… wird die USER_ID in naher Zukunft auslaufen, und die empfohlene Funktion lautet stattdessen DATABASE_PRINCIPAL_ID [ docs.microsoft.com / de-de / sql / t-sql / functions /…
Moiz Tankiwala
Verbindung ist unterbrochen. Neuer Link: docs.microsoft.com/en-us/sql/t-sql/functions/…
userM1433372
9

Weitere Verfeinerung, da dies zu einer optimalen Lesbarkeit führen würde.

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
Moiz Tankiwala
quelle
0

Wenn Sie resistered-Server verwenden, können Sie mehrere Server gleichzeitig prüfen und ein true / false zurückgeben mit:

SELECT @@servername,    
    CASE 
        WHEN EXISTS(SELECT name FROM sys.database_principals WHERE name = 'LoginName') THEN 1 
        ELSE 0 
    END AS YesNo
Sir schwört viel
quelle
Möglicherweise möchten Sie Ihre Antwort aktualisieren, um sie zu erwähnen, database_principalsanstatt server_principals- überprüfen Sie die Frage - es geht um Benutzer auf Datenbankebene .
Max Vernon