Periksa apakah pengguna ada di database SQL Server

28

Saya bekerja dengan SQL Server 2012. Saya ingin memeriksa apakah ada pengguna sebelum menambahkannya ke database.

Inilah yang telah saya uji:

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

Namun, kode SELECT name FROM [sys].[server_principals]ini tidak kembali jika pengguna itu ada di MyDatabase.

Bagaimana saya bisa mengecek jika ada pengguna MyDatabase?

VansFannel
sumber
1
Perlu diingat bahwa sys.database_principals berisi peran dan pengguna secara bersamaan, jadi jangan lupa untuk memfilter pengguna. Saya memperbarui kueri terakhir terhadap jawaban yang ditandai saat ini untuk referensi mudah.
Moiz Tankiwala

Jawaban:

26

Gunakan sys.database_principalssebagai ganti sys.server_principals.

Jadi kueri akhir akan terlihat seperti ini (akuntansi untuk filter pengguna):

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
sumber
2
Cara cepat untuk mendapatkan ini (atau pemeriksaan keberadaan objek lainnya) adalah dengan mengklik kanan pada objek database dan pilih "DROP And CREATE TO" yang akan menghasilkan klausa JIKA TIDAK ADA.
LowlyDBA
15

Saya menggunakan SUSER_ID () dan USER_ID () untuk hal-hal seperti ini:

-- 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
sumber
4
Sesuai rekomendasi Microsoft [ docs.microsoft.com/en-us/sql/t-sql/functions/… , USER_ID akan dihapus dalam waktu dekat dan fungsi yang disarankan untuk digunakan adalah DATABASE_PRINCIPAL_ID [ docs.microsoft.com / en-us / sql / t-sql / functions /…
Moiz Tankiwala
Tautan rusak. Tautan baru: docs.microsoft.com/en-us/sql/t-sql/functions/…
userM1433372
9

Penyempurnaan lebih lanjut karena ini akan membuat pembacaan yang lebih optimal

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

Jika Anda menggunakan server yang ditolak Anda dapat memeriksa banyak server sekaligus dan mengembalikan true / false dengan:

SELECT @@servername,    
    CASE 
        WHEN EXISTS(SELECT name FROM sys.database_principals WHERE name = 'LoginName') THEN 1 
        ELSE 0 
    END AS YesNo
Pak Bersumpah banyak
sumber
Anda mungkin ingin memperbarui jawaban Anda untuk menyebutkan database_principalsalih-alih server_principals- periksa pertanyaan - ini tentang pengguna di tingkat basis data .
Max Vernon