2011-07-17 2 views
36

사용자 (아니요 로그인)가 이미 데이터베이스에 생성되었는지 여부를 알 수있는 방법이 있습니까? 나는 사용자가 로그인이 아니라는 것을 의미한다. 로그인을 확인하는 방법을 알고 있기 때문이다. 특정 DB &에 할당 된 역할 내에서 생성 된 사용자를 확인해야합니다.USER가 데이터베이스에 이미 생성되었거나 SQL에 생성되지 않았는지 확인하는 방법은 무엇입니까?

이것은 로그인 확인에 대한 코드 : 사용자에 대한

SELECT name FROM sys.server_principals WHERE name = 'test_user' 

을하지만 어떻게? 이후 사용자가 생성되지 않은 경우 사용자를 생성하고 역할을 할당해야합니다. 그렇지 않으면 나는 창조하지 않고 계속할 것입니다. 당신이 sys.server_principals을 발견 한 경우

감사

답변

60

방법에 대해 :

USE (your database you want to check the user's existence in) 

SELECT * 
FROM sys.database_principals 
WHERE name = '(your user name to check here)' 

sys.server_principals

당신에게 서버 수준에 정의 된 로그인을 보여줍니다 - sys.database_principals 당신에게 데이터베이스 수준에서 원칙 (예를 들어, 사용자 계정)를 보여줍니다.

+0

@marc_s을 일치하는 사용자 이름을 말할 것이다 : 나는 가정 사용자 iN CREATE USER가 CREATE LOGIN의 로그인과 일치하지 않을 수 있습니다. 예를 들어'CREATE USER marcs FROM LOGIN gbn' – gbn

3

, 난 당신이 sys.database_principals을 발견하지 않은 놀랍군요. sid 열을 기준으로보기에 참여할 수 있습니다.

14

이 주어진 로그인 이름 당신에게

USE MyDB 
SELECT 
    sp.name AS ServerLoginName, 
    dp.name AS DBUserName 
FROM 
    sys.server_principals sp 
    LEFT JOIN 
    sys.database_principals dp ON sp.sid = dp.sid 
WHERE 
    sp.name = 'MyLogin' 
+0

감사합니다. "gbn"... 작동합니다;) – Q8Y

+0

더 정확한 대답입니다. SQL 로그인은 다른 이름을 가진 데이터베이스 사용자에 매핑 될 수 있습니다. – themilkyninja

+0

@themilkyninja, 당신은 (그 중 하나와 marc_s의 것) 모두 체크를 적용해야 할 수도 있습니다. 특정 이름의 사용자를 만들려면 marc_s의 체크를 실행하여 사용자 이름을 사용할 수 있는지 확인해야합니다. 또한 로그인과 사용자 간의 1 대 1 링크로 인해 gbn의 확인을 실행하여 로그인과 연결된 사용자가 없는지 확인해야합니다. –

7
use SomeDatabase 
go 

/* built-in system function */ 
select database_principal_id('UserNameHere') 

/* check if exists and drop */ 
if database_principal_id('UserNameHere') is not null 
    drop user 'UserNameHere' 
go 
+0

Stackoverflow에 오신 것을 환영합니다. 미래의 사용자가 귀하의 답변을 더 잘 이해할 수 있도록 귀하의 답변에 대해 자세히 설명해 주실 수 있습니까? – Sim

0
당신이이 방법에 대한 관심 수도

...

IF DATABASE_PRINCIPAL_ID('domain\lanid') IS NULL 
BEGIN 
    CREATE USER [domain\lanid] FOR LOGIN [domain\lanid] WITH DEFAULT_SCHEMA=[dbo] 
    EXEC sp_addrolemember N'db_ApplicationUserRole', N'domain\lanid' 
END 
관련 문제