2011-07-17 13 views
36

Veritabanında zaten kullanıcı (değil oturum açma) oluşturulduğunu bilmenin bir yolu var mı? Kullanıcı girişi değil, o zaman giriş için nasıl kontrol edeceğimi biliyorum. Belirli bir DB &'a atanan kullanıcıya, kendisine atanan bir rol olup olmadığını kontrol etmem gerekiyor.KULLANICININ SQL'de zaten veritabanında oluşturulup oluşturulmadığını nasıl kontrol edebilirim?

Bu giriş için kontrol için kod: kullanıcı hakkında

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

ama nasıl? Kullanıcıyı oluşturmam ve onun yaratılmamış olması durumunda ona bir rol atamam gerektiğinden. Aksi takdirde, yaratmadan devam edeceğim. Eğer sys.server_principals bulduysanız

Teşekkür

cevap

60

ne dersiniz:

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

size sunucu düzeyinde tanımlanan oturumların gösterir - sys.database_principals sana bir veritabanı seviyesinde prensipleri (örneğin kullanıcı hesapları) gösterir.

+0

@marc_s eşleşen kullanıcı adını söyleyecektir: Ben farz CREATE USER kullanıcısı, CREATE LOGIN uygulamasında oturum açma ile eşleşmeyebilir. Örneğin, "GİRİŞ GİRİŞİNDEN KULLANICI MARKALARI OLUŞTURUN" – gbn

14

Bu, belirli bir oturum açma adı için size

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

Teşekkürler "gbn" ... işe yarıyor;) – Q8Y

+0

Bu daha doğru bir cevap. SQL Login, farklı bir ada sahip bir veritabanı kullanıcısı ile eşlenebilir. – themilkyninja

+0

@themilkyninja Her iki çekini de uygulamalısınız (o ve marc_s'in bir tanesi). Belirli bir ada sahip bir kullanıcı oluşturacaksanız, kullanıcı adının kullanılabilir olduğunu kontrol etmeniz gerekir (marc_s'in kontrolünü çalıştırarak). Ayrıca, oturum açma ve kullanıcı arasındaki 1'e 1 bağlantı nedeniyle, kullanıcının oturum açma ile ilişkili olmadığını kontrol etmeniz gerekir (gbn'nin kontrolünü çalıştırarak). –

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'a Hoş Geldiniz. Gelecek kullanıcıların cevabınızı daha iyi anlayabilmesi için cevabınızı ayrıntılı olarak açıklayabilir misiniz? – Sim

0
Siz de bu yöntem için önemli olabilecek

...

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 
İlgili konular