2011-07-17 42 views
36

有沒有一種方法可以從中知道用戶(不是登錄名)是否已經在數據庫中創建?我的意思是用戶不是登錄,因爲我知道如何檢查登錄。我需要檢查在特定DB &中爲其創建的用戶。如何檢查用戶是否已經在數據庫中創建或不在SQL中?

這是爲登錄檢查代碼:

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

但如何對用戶?因爲我需要創建用戶併爲它分配一個角色,如果它沒有創建。否則,我會繼續創建。

感謝

回答

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:我認爲用戶i CREATE USER可能與CREATE LOGIN中的登錄名不匹配。例如'CREATE USER marcs FROM LOGIN gbn' – gbn

3

如果您發現sys.server_principals,我很驚訝你有沒有發現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,您可能必須同時應用兩項檢查(即one和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 
相關問題