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_principals대신에 사용하십시오 sys.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"를 선택하면 올바른 IF NOT EXISTS 절이 생성됩니다.
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 / functions /…
Moiz Tankiwala

링크가 끊어졌습니다. 새 링크 : docs.microsoft.com/en-us/sql/t-sql/functions/…
userM1433372

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

저항 서버를 사용하는 경우 한 번에 많은 서버를 확인하고 다음과 같이 true / false를 반환 할 수 있습니다.

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.