जाँच करें कि क्या कोई उपयोगकर्ता SQL सर्वर डेटाबेस में मौजूद है


28

मैं SQL Server 2012 के साथ काम कर रहा हूं। मैं यह जांचना चाहता हूं कि क्या उपयोगकर्ता डेटाबेस में जोड़ने से पहले मौजूद है।

यह मैंने परीक्षण किया है:

USE [MyDatabase]
GO

IF NOT EXISTS (SELECT name 
                FROM [sys].[server_principals]
                WHERE name = N'IIS APPPOOL\MyWebApi AppPool')
Begin
    CREATE USER [IIS APPPOOL\MyWebApi AppPool] 
    FOR LOGIN [IIS APPPOOL\MyWebApi AppPool] WITH DEFAULT_SCHEMA=[dbo]
end
ALTER ROLE [db_owner] ADD MEMBER [IIS APPPOOL\MyWebApi AppPool]
GO

लेकिन, SELECT name FROM [sys].[server_principals]यदि उपयोगकर्ता मौजूद है तो यह कोड वापस नहीं आता है MyDatabase

यदि कोई उपयोगकर्ता मौजूद है तो मैं कैसे जांच सकता हूं MyDatabase?


1
ध्यान रखें कि sys.database_principals में भूमिकाएँ और उपयोगकर्ता एक साथ होते हैं, इसलिए किसी को उपयोगकर्ताओं को फ़िल्टर करना नहीं भूलना चाहिए। मैं आसान संदर्भ के लिए वर्तमान में चिह्नित उत्तर के खिलाफ अंतिम प्रश्न को अपडेट कर रहा हूं।
मोइज़ टंकीवाला

जवाबों:


26

के sys.database_principalsबजाय का उपयोग करें sys.server_principals

तो अंतिम क्वेरी इस तरह दिखाई देगी (उपयोगकर्ता फ़िल्टर के लिए लेखांकन):

USE [MyDatabase]
GO

IF NOT EXISTS (SELECT [name]
                FROM [sys].[database_principals]
                WHERE [type] = N'S' AND [name] = N'IIS APPPOOL\MyWebApi AppPool')
Begin
    CREATE USER [IIS APPPOOL\MyWebApi AppPool] 
    FOR LOGIN [IIS APPPOOL\MyWebApi AppPool] WITH DEFAULT_SCHEMA=[dbo]
end
ALTER ROLE [db_owner] ADD MEMBER [IIS APPPOOL\MyWebApi AppPool]
GO

2
इसे प्राप्त करने का एक त्वरित तरीका (या अन्य ऑब्जेक्ट अस्तित्व की जाँच) एक डेटाबेस ऑब्जेक्ट पर राइट क्लिक करना है और "DROP और CREATE TO" का चयन करना है जो उचित IF NOT EXISTS क्लॉज उत्पन्न करेगा।
LowlyDBA

15

मैं इस तरह की चीजों के लिए SUSER_ID () और USER_ID () का उपयोग करता हूं:

-- Check SQL Server Login
IF SUSER_ID('SomeLogin') IS NULL
    CREATE LOGIN SomeLogin WITH PASSWORD = 'SomePassword';

-- Check database user
IF USER_ID('SomeUser') IS NULL
    CREATE USER SomeUser FOR LOGIN SomeLogin;

4
Microsoft की अनुशंसा के अनुसार [ docs.microsoft.com/en-us/sql/t-sql/functions/… , USER_ID को निकट भविष्य में चरणबद्ध किया जाएगा और इसके बजाय उपयोग करने के लिए अनुशंसित फ़ंक्शन DATABASE_PRINCIPAL_ID [ docs.microsoft.com / en-us / sql / t-sql / functions /…
मोइज़ टंकीवाला

लिंक टूट गया है। नया लिंक: docs.microsoft.com/en-us/sql/t-sql/functions/…
userM1433372

9

आगे शोधन के रूप में यह एक और अधिक इष्टतम पढ़ा होगा-

USE [MyDatabase]
GO

IF DATABASE_PRINCIPAL_ID('IIS APPPOOL\MyWebApi AppPool') IS NULL
BEGIN
    CREATE USER [IIS APPPOOL\MyWebApi AppPool] 
    FOR LOGIN [IIS APPPOOL\MyWebApi AppPool] WITH DEFAULT_SCHEMA=[dbo]
END
ALTER ROLE [db_owner] ADD MEMBER [IIS APPPOOL\MyWebApi AppPool]
GO

0

यदि आप रिसिस्टर किए गए सर्वर का उपयोग कर रहे हैं, तो आप एक साथ कई सर्वरों की जांच कर सकते हैं और इसके साथ एक सच्चा / गलत लौटा सकते हैं:

SELECT @@servername,    
    CASE 
        WHEN EXISTS(SELECT name FROM sys.database_principals WHERE name = 'LoginName') THEN 1 
        ELSE 0 
    END AS YesNo

आप database_principalsइसके बजाय उल्लेख करने के लिए अपने उत्तर को अपडेट करना चाहते हैं server_principals- प्रश्न की जांच कर सकते हैं - यह डेटाबेस स्तर पर उपयोगकर्ताओं के बारे में है।
मैक्स वर्नोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.