Kiểm tra xem người dùng có tồn tại trong cơ sở dữ liệu SQL Server không


28

Tôi đang làm việc với SQL Server 2012. Tôi muốn kiểm tra xem người dùng có tồn tại hay không trước khi thêm nó vào cơ sở dữ liệu.

Đây là những gì tôi đã thử nghiệm:

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

Nhưng, mã SELECT name FROM [sys].[server_principals]này không trả về nếu người dùng đó tồn tại MyDatabase.

Làm cách nào để kiểm tra xem người dùng có tồn tại MyDatabasekhông?


1
Hãy nhớ rằng sys.database_principals chứa các vai trò và người dùng với nhau, vì vậy người ta không được quên để lọc người dùng. Tôi đang cập nhật truy vấn cuối cùng với câu trả lời hiện được đánh dấu để dễ tham khảo.
Moiz Tankiwala

Câu trả lời:


26

Sử dụng sys.database_principalsthay vì sys.server_principals.

Vì vậy, truy vấn cuối cùng sẽ trông như thế này (chiếm bộ lọc người dùng):

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
Một cách nhanh chóng để có được điều này (hoặc kiểm tra sự tồn tại của đối tượng khác) là nhấp chuột phải vào một đối tượng cơ sở dữ liệu và chọn "DROP And CREATE TO" sẽ tạo ra mệnh đề IF KHÔNG EXISTS thích hợp.
LowlyDBA

15

Tôi sử dụng SUSER_ID () và USER_ID () cho những thứ này:

-- 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
Theo khuyến nghị của Microsoft [ docs.microsoft.com/en-us/sql/t-sql/fifts/ , thì USER_ID sẽ bị loại bỏ trong tương lai gần và chức năng được đề xuất sử dụng thay thế là DATABASE_PRINCIPAL_ID [ docs.microsoft.com / en-us / sql / t-sql / chức năng /
Mạnh

Liên kết bị hỏng. Liên kết mới: docs.microsoft.com/en-us/sql/t-sql/fifts/ Kẻ
userM1433372

9

Tinh chỉnh thêm vì điều này sẽ làm cho việc đọc tối ưu hơn

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

Nếu bạn đang sử dụng máy chủ điện trở, bạn có thể kiểm tra nhiều máy chủ cùng một lúc và trả về giá trị true / false bằng:

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

Bạn có thể muốn cập nhật câu trả lời của mình để đề cập database_principalsthay vì server_principals- kiểm tra câu hỏi - đó là về người dùng ở cấp cơ sở dữ liệu .
Max Vernon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.