2010-02-02 18 views
8

मैं एक से अधिक डेटाबेस में उपयोगकर्ताओं को एक ही भूमिका में जोड़ना चाहता हूं। हालांकि भूमिका सभी डेटाबेस में मौजूद/उपस्थित नहीं हो सकती है। मैं कैसे जांच सकता हूं कि भूमिका डेटाबेस में मौजूद है या नहीं और यदि यह उस भूमिका में उपयोगकर्ताओं को जोड़ती है?जांचें कि डीबी में भूमिका मौजूद है या नहीं?

उदा। यदि भूमिका मौजूद है शुरू भूमिका अंत में उपयोगकर्ता जोड़ें

+0

कृपया इस लिंक का संदर्भ लें। शायद वही बात जो आप ढूंढ रहे हैं http://stackoverflow.com/questions/1201160/how-do-i-determine-if-a-डेटा-role-exists-in-sql-server – madatanic

+0

संभावित डुप्लिकेट [कैसे क्या मैं निर्धारित करता हूं कि SQL सर्वर में डेटाबेस भूमिका मौजूद है या नहीं?] (https://stackoverflow.com/questions/1201160/how-do-i-determine-if-a-डेटा-role-exists-in-sql-server) –

उत्तर

15

कोशिश:

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

यह विफल रहता है यदि आपके पास ऐसा उपयोगकर्ता है जो समान "भूमिका" नाम होता है –

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

मैं अभी तक टिप्पणी नहीं कर सकता, तो मैं एक जवाब के रूप में जोड़ना है।

मुझे जितना संभव हो उतना विशिष्ट होना पसंद है, यही कारण है कि मैं प्रिंसिपल टाइप को प्राथमिकता देता हूं। यही कारण है कि मैंने हारून के जवाब को वोट दिया।

DATABASE_PRINCIPAL_ID का उपयोग करके अप्रत्याशित परिणाम दे सकते हैं यदि एक ही मूल प्रकार का एक ही नाम है जिसे आप जोड़ना चाहते हैं। ऐसा इसलिए है क्योंकि DATABASE_PRINCIPAL_ID वर्तमान डेटाबेस में प्रिंसिपल की आईडी संख्या देता है, विशेष रूप से किसी डेटाबेस की भूमिका के साथ प्रिंसिपल के लिए नहीं।

मान लें कि आपके पास उपयोगकर्ता नाम डेटाबेस नाम के समान नाम है। याडा की लिपि की स्थिति सफलता का संकेत देगी, लेकिन यह भूमिका नहीं जोड़ती क्योंकि उस नाम के साथ पहले से ही प्रिंसिपल है। हालांकि, हारून के स्क्रिप्ट निम्न त्रुटि वापसी होगी:

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

मैं नहीं बल्कि इस मुद्दे पर जल्दी (जैसे जब स्क्रिप्ट चलाया जाता है) को पकड़ने था पर बाद में की तुलना में (जैसे जब मेरे एप्लिकेशन का इस्तेमाल किया जा रहा है)।

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

मैं वास्तव में एक त्रुटि दिखाने के इस परिदृश्य संभालने के लिए और नहीं चाहते हैं, मैं कुछ इस तरह इस्तेमाल कर सकते हैं:

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

निर्दिष्ट करने के लिए

यहाँ मैं सामान्य रूप से उपयोग करेंगे डेटाबेस जिसमें आप इसमें भूमिका निभाएंगे, आपको

USE [DATABASE_NAME]; 

का उपयोग करने की आवश्यकता है, तो आप Ya जारी रख सकते हैं दा का जवाब है और यह इस तरह होगा

USE [DATABASE_NAME]; 
IF DATABASE_PRINCIPAL_ID('role') IS NULL 
BEGIN 
-- add user here 
CREATE ROLE role AUTHORIZATION MyUser; 
END 
संबंधित मुद्दे