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.