2010-02-02 39 views
8

Aynı role birden fazla veritabanında kullanıcı eklemek istiyorum. Ancak, rol, tüm veritabanında mevcut olabilir/olamaz. Rolün veritabanında olup olmadığını ve bu rolde kullanıcı eklediğini nasıl kontrol edebilirim?DB'de rol olup olmadığını kontrol edin.

örn. Henüz yorum yapamam

IF DATABASE_PRINCIPAL_ID('role') IS NULL 
BEGIN 
    -- add user here 
    CREATE ROLE role AUTHORIZATION MyUser; 
END 
+0

gibi olacaktır. Lütfen bu bağlantıya bakınız. Muhtemelen aynı şeyi arıyorsun http://stackoverflow.com/questions/1201160/how-do-i-determine-if-a-database-role-exists-in-sql-server – madatanic

+0

Olası kopyası SQL Server'da bir veritabanı rolü olup olmadığını belirleyebilir miyim?] (https://stackoverflow.com/questions/1201160/how-do-i-determine-if-a-database-role-exists-in-sql-server) –

cevap

15

deneyin kullanıcı ekleyin BEGIN.

Mümkün olduğu kadar spesifik olmayı severim, bu yüzden asıl türü kullanmayı tercih ederim. Bu yüzden Aaron'un cevabına oy verdim.

DATABASE_PRINCIPAL_ID'yi kullanmak, eklemek istediğiniz rolle aynı ada sahip başka bir temel tür varsa, beklenmedik sonuçlar verebilir. Bunun nedeni, DATABASE_PRINCIPAL_ID dosyasının, özellikle bir veritabanı rolü türünde bir yönetici için değil, geçerli veritabanında ana kimlik numarasını döndürmesidir.

Veritabanı rolü ile aynı ada sahip bir kullanıcınız olduğunu varsayalım. Yada komut dosyasının durumu başarıya işaret eder, ancak bu adla zaten bir ana olduğu için bu rol eklenmez. Ancak, Aaron komut aşağıdaki hatayı döndürür:

User, group, or role 'name' already exists in the current database.

Doğrusu erken (script çalıştırıldığında örn olduğunda) bu sorunu yakalamak istiyorum sonra daha (örneğin benim app kullanıldığında).

IF NOT EXISTS(SELECT NULL FROM sys.database_principals WHERE [name] = 'role_name' AND [type]='R') 
BEGIN 
    -- add user; 
END 

Gerçekten bir hata göstermiyor bu senaryoyu işleyebilir ve isterseniz, böyle bir şey kullanabilirsiniz:

DECLARE @RoleName sysname, 
     @PrincipalType NVARCHAR(60); 

SET @RoleName = 'role_name'; 
SET @PrincipalType = (SELECT type_desc FROM sys.database_principals WHERE [name] = @RoleName); 

IF @PrincipalType IS NULL 
BEGIN 
    -- Add user; 
END 
ELSE IF @PrincipalType <> 'DATABASE_ROLE' 
BEGIN 
    --Deal with the issue as desired. Here we're printing out a warning. Important: The status will still indicate that the Query executed successfully when using PRINT to show warnings. 
    PRINT 'WARNING: The ' + @RoleName + ' database role was not created. A principal already exists in the database with a type of ' + @PrincipalType + '.'; 
END 
+0

Aynı "rol" adına sahip olan bir kullanıcınız varsa bu başarısız olur. –

7
IF EXISTS 
(
    SELECT 1 
    FROM sys.database_principals 
    WHERE type_desc = 'DATABASE_ROLE' 
    AND name = 'name' 
) 
BEGIN 
    -- add user; 
END 
4

, bu yüzden cevap olarak bu eklemek zorunda: rolü mevcuttur EĞER rol END içinde

0

belirtmek için Buraya

Normalde kullanmak yapardım İçindeki rolü yaratacağınız veritabanı,

kullanmanız gerekir. da cevaptır ve bu

USE [DATABASE_NAME]; 
IF DATABASE_PRINCIPAL_ID('role') IS NULL 
BEGIN 
-- add user here 
CREATE ROLE role AUTHORIZATION MyUser; 
END 
İlgili konular