Sprawdź, czy użytkownik istnieje w bazie danych SQL Server

28

Pracuję z SQL Server 2012. Chcę dodać użytkownika do bazy danych przed dodaniem go do bazy danych.

Oto co przetestowałem:

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

Ale ten kod SELECT name FROM [sys].[server_principals]nie zwraca się, jeśli ten użytkownik istnieje MyDatabase.

Jak mogę sprawdzić, czy użytkownik istnieje MyDatabase?

VansFannel
źródło
1
Należy pamiętać, że sys.database_principals zawiera role i użytkowników razem, więc nie można zapominać o filtrowaniu użytkowników. Aktualizuję ostatnie zapytanie w stosunku do obecnie zaznaczonej odpowiedzi w celu ułatwienia wyszukiwania.
Moiz Tankiwala

Odpowiedzi:

26

Użyj sys.database_principalszamiast sys.server_principals.

Tak więc końcowe zapytanie wyglądałoby tak (uwzględniając filtr użytkownika):

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
źródło
2
Szybkim sposobem na uzyskanie tego (lub sprawdzenia istnienia innego obiektu) jest kliknięcie prawym przyciskiem myszy obiektu bazy danych i wybranie „DROP AND CREATE TO”, które wygeneruje odpowiednią klauzulę IF NOT EXISTS.
LowlyDBA
15

Używam SUSER_ID () i USER_ID () do tego rodzaju rzeczy:

-- 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
źródło
4
Zgodnie z zaleceniami Microsoftu [ docs.microsoft.com/en-us/sql/t-sql/functions /... USER_ID zostanie wycofany w najbliższej przyszłości, a zalecaną funkcją do użycia jest DATABASE_PRINCIPAL_ID [ docs.microsoft.com / en-us / sql / t-sql / functions /…
Moiz Tankiwala
Link jest zepsuty. Nowy link: docs.microsoft.com/en-us/sql/t-sql/functions/…
userM1433372
9

Dalsze udoskonalenie, ponieważ pozwoliłoby to na bardziej optymalny odczyt

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
źródło
0

Jeśli używasz zarejestrowanych serwerów, możesz sprawdzić wiele serwerów jednocześnie i zwrócić wartość true / false za pomocą:

SELECT @@servername,    
    CASE 
        WHEN EXISTS(SELECT name FROM sys.database_principals WHERE name = 'LoginName') THEN 1 
        ELSE 0 
    END AS YesNo
Sir przysięga bardzo
źródło
Możesz zaktualizować swoją odpowiedź, aby wspomnieć database_principalszamiast server_principals- sprawdź pytanie - dotyczy użytkowników na poziomie bazy danych .
Max Vernon,