Bir kullanıcının bir SQL Server veritabanında var olup olmadığını kontrol edin


28

SQL Server 2012 ile çalışıyorum. Bir veritabanına eklemeden önce bir kullanıcının olup olmadığını kontrol etmek istiyorum.

Test ettiğim şey bu:

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

Ancak, bu SELECT name FROM [sys].[server_principals]kullanıcı söz konusu ise bu kod geri dönmez MyDatabase.

Bir kullanıcının içeride olup olmadığını nasıl kontrol edebilirim MyDatabase?


1
Sys.database_principals'in birlikte roller ve kullanıcılar içerdiğini unutmayın, bu nedenle kullanıcıların filtrelemeyi unutmaması gerekir. Nihai sorguyu, kolay referans olması için işaretlenmiş yanıtla karşılaştırıyorum.
Moiz Tankiwala

Yanıtlar:


26

Yerine sys.database_principalskullanın sys.server_principals.

Böylece son sorgu şöyle görünecektir (kullanıcı filtresinin hesabı):

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
Bunu elde etmenin hızlı bir yolu (veya başka bir nesne varlığı kontrolünü yapmak), bir veritabanı nesnesine sağ tıklamak ve doğru IF NOT EXISTS yan tümcesini oluşturacak olan "DROP And CREATE TO" seçeneğini seçmektir.
LowlyDBA

15

Bu tür şeyler için SUSER_ID () ve USER_ID () kullanıyorum:

-- 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’un önerisine göre [ docs.microsoft.com/en-us/sql/t-sql/functions/… , USER_ID yakın bir gelecekte kaldırılacak ve bunun yerine önerilen işlev DATABASE_PRINCIPAL_ID [ docs.microsoft.com / tr-us / sql / t-sql / functions /…
Moiz Tankiwala


9

Bu, daha optimal bir okuma yapacağı için daha fazla ayrıntılandırma

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

Yeniden boyutlandırılmış sunucular kullanıyorsanız, birçok sunucuyu bir kerede kontrol edebilir ve doğru / yanlış ile döndürebilirsiniz:

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

Cevap database_principalsyerine, cevabı güncellemek isteyebilirsiniz server_principals- soruyu kontrol edin - bunun veritabanı seviyesindeki kullanıcılar hakkında olması gerekir .
Max Vernon,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.