Перевірте, чи існує користувач у базі даних 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?


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
Швидкий спосіб отримати це (або інша перевірка існування об'єкта) - це клацнути правою кнопкою миші на об’єкт бази даних та вибрати пункт "ЗРОБИТИ І СТВОРИТИ ДО", який створить належну пропозицію ЯКЩО НЕ існує.
НизькоДБА

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;

4
Відповідно до рекомендації Microsoft [ docs.microsoft.com/en-us/sql/t-sql/functions/… , в найближчому майбутньому буде припинено використання USER_ID, а рекомендована функція використовувати замість цього DATABASE_PRINCIPAL_ID [ docs.microsoft.com / en-us / sql / t-sql / функции /…
Moiz Tankiwala

Посилання розірвано. Нове посилання: docs.microsoft.com/en-us/sql/t-sql/functions/…
користувачM1433372

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

Якщо ви використовуєте зареєстровані сервери, ви можете перевірити відразу декілька серверів і повернути справжнє / помилкове за допомогою:

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- перевірити питання - це стосується користувачів на рівні бази даних .
Макс Вернон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.