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?


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

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;

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


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

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

Anda mungkin ingin memperbarui jawaban Anda untuk menyebutkan database_principalsalih-alih server_principals- periksa pertanyaan - ini tentang pengguna di tingkat basis data .
Max Vernon
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.