Verifique se existe um usuário em um banco de dados SQL Server

28

Estou trabalhando com o SQL Server 2012. Quero verificar se existe um usuário antes de adicioná-lo a um banco de dados.

Isto é o que eu testei:

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

Mas, esse código SELECT name FROM [sys].[server_principals]não retornará se esse usuário existir MyDatabase.

Como posso verificar se existe um usuário MyDatabase?

VansFannel
fonte
1
Lembre-se de que os sys.database_principals contêm funções e usuários juntos, portanto, não se esqueça de filtrar os usuários. Estou atualizando a consulta final com relação à resposta atualmente marcada para facilitar a referência.
Moiz Tankiwala

Respostas:

26

Use em sys.database_principalsvez de sys.server_principals.

Portanto, a consulta final ficaria assim (contabilizando o filtro do usuário):

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
fonte
2
Uma maneira rápida de obter essa (ou outra verificação de existência de objeto) é clicar com o botão direito do mouse em um objeto de banco de dados e selecionar "DROP AND CREATE TO", que gerará a cláusula apropriada IF NOT EXISTS.
precisa saber é o seguinte
15

Eu uso SUSER_ID () e USER_ID () para esse tipo de coisa:

-- 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
fonte
4
De acordo com a recomendação da Microsoft [ docs.microsoft.com/en-us/sql/t-sql/functions/… , o USER_ID será eliminado no futuro próximo e a função recomendada a ser usada é DATABASE_PRINCIPAL_ID [ docs.microsoft.com / pt-br / sql / t-sql / functions /…
Moiz Tankiwala
Link quebrado. Novo link: docs.microsoft.com/en-us/sql/t-sql/functions/…
userM1433372
9

Um refinamento adicional, pois isso tornaria uma leitura mais ideal

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
fonte
0

Se você estiver usando servidores resistentes, poderá verificar vários servidores ao mesmo tempo e retornar um verdadeiro / falso com:

SELECT @@servername,    
    CASE 
        WHEN EXISTS(SELECT name FROM sys.database_principals WHERE name = 'LoginName') THEN 1 
        ELSE 0 
    END AS YesNo
O senhor jura muito
fonte
Você pode atualizar sua resposta para mencionar em database_principalsvez de server_principals- verifique a pergunta - é sobre usuários no nível do banco de dados .
Max Vernon