2011-07-17 12 views
36

ユーザー(ではなく、ログイン)が既にデータベースに作成されているかどうかはわかりますか?私はログインを確認する方法を知っているので、私はユーザーではないログインを意味します。私は特定のDB &の中で作成されたユーザをチェックする必要があります。USERがデータベースに既に作成されているかどうかを確認する方法は?

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を一致するユーザー名を教えてくれます:私は仮定しましたユーザーiN 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、両方のチェック(その1つと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