Controllare se esiste un utente in un database di SQL Server


28

Sto lavorando con SQL Server 2012. Voglio verificare se esiste un utente prima di aggiungerlo a un database.

Questo è ciò che ho testato:

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

Ma questo codice SELECT name FROM [sys].[server_principals]non viene restituito se l'utente esiste MyDatabase.

Come posso verificare se esiste un utente MyDatabase?


1
Tenere presente che sys.database_principals contiene ruoli e utenti insieme, quindi non bisogna dimenticare di filtrare gli utenti. Sto aggiornando la query finale rispetto alla risposta attualmente contrassegnata per un facile riferimento.
Moiz Tankiwala,

Risposte:


26

Usa sys.database_principalsinvece di sys.server_principals.

Quindi la query finale sarebbe simile a questa (tenendo conto del filtro utente):

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
Un modo rapido per ottenere questo (o il controllo dell'esistenza di altri oggetti) è fare clic con il tasto destro su un oggetto del database e selezionare "DROP AND CREATE TO" che genererà la clausola IF NOT EXISTS corretta.
LowlyDBA,

15

Uso SUSER_ID () e USER_ID () per questo tipo di cose:

-- 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
Secondo la raccomandazione di Microsoft [ docs.microsoft.com/en-us/sql/t-sql/functions/… , USER_ID verrà gradualmente eliminato nel prossimo futuro e la funzione consigliata da utilizzare invece è DATABASE_PRINCIPAL_ID [ docs.microsoft.com / it-it / sql / t-sql /
Functions

Il collegamento è interrotto. Nuovo collegamento: docs.microsoft.com/en-us/sql/t-sql/functions/…
userM1433372

9

Ulteriore perfezionamento in quanto ciò renderebbe una lettura più ottimale

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

Se si utilizzano server registrati, è possibile controllare più server contemporaneamente e restituire un valore true / false con:

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

Potresti voler aggiornare la tua risposta per menzionarla database_principalsinvece di server_principals- controlla la domanda - riguarda gli utenti a livello di database .
Max Vernon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.