Проверьте, существует ли пользователь в базе данных 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?

VansFannel
источник
1
Имейте в виду, что sys.database_principals содержит роли и пользователей вместе, поэтому нельзя забывать фильтровать пользователей. Я обновляю окончательный запрос по текущему помеченному ответу для удобства.
Мойз Танкивала

Ответы:

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 () и USER_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;
spaghettidba
источник
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- проверить вопрос - это касается пользователей на уровне базы данных .
Макс Вернон