क्या मैं किसी विशेष उपयोगकर्ता के स्वामित्व वाली सभी डेटाबेस वस्तुओं को पुनः प्राप्त कर सकता हूं?


16

हमारे पास एक उपयोगकर्ता है जो छोड़ रहा है और मुझे उसके पास मौजूद हर डेटाबेस ऑब्जेक्ट को जानना होगा। क्या कोई क्वेरी है जो यह जानकारी प्रदान करेगी?

जवाबों:


22

यह आपको मिलना चाहिए जो आप देख रहे हैं:

;with objects_cte as
(
    select
        o.name,
        o.type_desc,
        case
            when o.principal_id is null then s.principal_id
            else o.principal_id
        end as principal_id
    from sys.objects o
    inner join sys.schemas s
    on o.schema_id = s.schema_id
    where o.is_ms_shipped = 0
    and o.type in ('U', 'FN', 'FS', 'FT', 'IF', 'P', 'PC', 'TA', 'TF', 'TR', 'V')
)
select
    cte.name,
    cte.type_desc,
    dp.name
from objects_cte cte
inner join sys.database_principals dp
on cte.principal_id = dp.principal_id
where dp.name = 'YourUser';

यह उन वस्तुओं को प्राप्त करेगा जो आपके विशेष उपयोगकर्ता (विकल्प) के स्वामित्व में हैं 'YourUser' पाठ्यक्रम का ) के । इस क्वेरी पुल के ऑब्जेक्ट्स के प्रकार हैं:

  • FN = SQL स्केलर फ़ंक्शन
  • FS = असेंबली (CLR) स्केलर-फंक्शन
  • एफटी = असेंबली (सीएलआर) तालिका-मूल्यवान फ़ंक्शन
  • IF = SQL इनलाइन टेबल-वैल्यू फ़ंक्शन
  • पी = SQL संग्रहित प्रक्रिया
  • पीसी = असेंबली (सीएलआर) संग्रहीत-प्रक्रिया
  • टीए = असेंबली (सीएलआर) डीएमएल ट्रिगर
  • TF = SQL टेबल-वैल्यू-फंक्शन
  • TR = SQL DML ट्रिगर
  • यू = टेबल (उपयोगकर्ता द्वारा परिभाषित)
  • वी = देखें

1
(यह खोज के माध्यम से मिला।) इसमें गैर-स्कीमा-स्कॉप्ड ऑब्जेक्ट जैसे कि सर्विस ब्रोकर संदेश प्रकार शामिल नहीं हैं। क्या आप विशिष्ट वस्तु मेटाडेटा के सभी विचारों को खोले बिना उस जानकारी को प्राप्त करने का एक आसान तरीका जानते हैं? (इसके अलावा, मुझे यकीन नहीं है कि आप इस क्वेरी में लौटाई गई वस्तुओं के प्रकारों को सीमित क्यों करते हैं, क्योंकि यह ब्याज की कुछ वस्तुओं को बाहर कर सकता है।)
जॉन सेइगल

खैर, मैंने अपना दृष्टिकोण बनाना शुरू कर दिया। यदि आप एक बेहतर समाधान के बारे में जानते हैं, तो कृपया मुझे बताएं।
जॉन सीगल

@JonSeigel मैंने ऊपर एक UNION का उपयोग करके लिखा है। क्या आप अपनी पोस्ट कर सकते हैं ताकि मैं अपनी तुलना कर सकूं और उसमें सुधार कर सकूं?
छद्मटोड

3

सभी गैर-सा डेटाबेस स्वामियों को दिखाने के लिए:

SELECT suser_sname( owner_sid ) OwnerID , * FROM sys.databases where suser_sname( owner_sid ) <> 'sa'

यदि आपको SQL सिस्टम की आवश्यकता है तो नौकरी के स्वामी:

select s.name,l.name  
from  msdb..sysjobs s 
left join master.sys.syslogins l on s.owner_sid = l.sid 
where l.name is not null and l.name <> 'sa'
order by l.name

1
हर डेटाबेस ऑब्जेक्ट के लिए और केवल डेटाबेस ही नहीं, प्रश्न पूछा गया।
SqlWorldWide

@SqlWorldWide - लेकिन स्वीकृत उत्तर में डेटाबेस शामिल नहीं है, इसलिए यह उत्तर इसके अतिरिक्त मददगार है। (दिलचस्प बात यह है कि यहाँ लौटे 'मालिक' के नाम भी स्वीकार किए गए उत्तर में sys.database_principals तालिका में मौजूद नहीं हैं। जानना चाहेंगे कि क्या हो रहा है।)
youcantryreachingme

2

नौकरियों के लिए, आप syslogins का उपयोग नहीं कर सकते क्योंकि स्वामी एक समूह का हिस्सा हो सकता है और लॉगिन में मौजूद नहीं हो सकता है। नीचे का उपयोग करें

select msdb.[dbo].[SQLAGENT_SUSER_SNAME](owner_sid), * 
from msdb.dbo.sysjobs
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.