ตรวจสอบว่ามีผู้ใช้อยู่ในฐานข้อมูล 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 มีบทบาทและผู้ใช้ร่วมกันดังนั้นจึงต้องไม่ลืมที่จะกรองผู้ใช้ ฉันกำลังอัปเดตคำถามสุดท้ายกับคำตอบที่ทำเครื่องหมายไว้ในปัจจุบันเพื่อให้อ้างอิงได้ง่าย
Moiz Tankiwala

คำตอบ:


26

ใช้แทนsys.database_principalssys.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
วิธีที่รวดเร็วในการรับสิ่งนี้ (หรือการตรวจสอบการมีอยู่ของวัตถุอื่น) คือการคลิกขวาบนวัตถุฐานข้อมูลและเลือก "DROP And CREATE TO" ซึ่งจะสร้างประโยคที่เหมาะสมถ้าไม่มี
LowlyDBA

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- ตรวจสอบคำถาม - มันเกี่ยวกับผู้ใช้ในระดับฐานข้อมูล
Max Vernon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.