Belirli bir kullanıcının sahip olduğu tüm veritabanı nesnelerini alabilir miyim?


16

Giden bir kullanıcı var ve sahip olduğu her veritabanı nesnesini bilmem gerekiyor. Bu bilgiyi sağlayacak bir sorgu var mı?

Yanıtlar:


22

Bu, aradığınızı bulmanızı sağlayacaktır:

;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';

Bu, kendi kullanıcınızın sahip olduğu nesneleri alır 'YourUser'(elbette bunun yerine ). Bu sorgunun çektiği nesne türleri şunlardır:

  • FN = SQL skaler fonksiyonu
  • FS = Montaj (CLR) skaler fonksiyon
  • FT = Montaj (CLR) tablo değerli işlev
  • IF = SQL satır içi tablo değerli işlev
  • P = SQL Saklı Yordamı
  • PC = Montaj (CLR) saklı yordamı
  • TA = Montaj (CLR) DML tetikleyicisi
  • TF = SQL tablo değerli işlev
  • TR = SQL DML tetikleyici
  • U = Tablo (kullanıcı tanımlı)
  • V = Görüntüle

1
(Bunu arama yoluyla buldum.) Bu, Hizmet Aracısı ileti türleri gibi şema kapsamı dışında nesneleri içermez. Belirli nesne meta veri görünümlerini incelemeden bu bilgileri almanın kolay bir yolunu biliyor musunuz? (Ayrıca, bazı ilgi nesnelerini hariç tutabileceğinden, bu sorguda döndürülen nesne türlerini neden sınırladığınızdan emin değilim.)
Jon Seigel

Sonunda kendi görüşümü yarattım. Daha iyi bir çözüm biliyorsanız, lütfen bana bildirin.
Jon Seigel

@JonSeigel Yukarıdakine BİRLİĞİ kullanarak bir tane yazdım. Benimkini gönderebilir miyim, böylece benimkini karşılaştırıp geliştirebilir miyim?
Mayıs

3

Tüm sa olmayan veritabanı sahiplerini göstermek için:

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

SQL sistemi İş sahiplerine ihtiyacınız varsa:

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
Soru sadece veritabanının kendisi için değil, her veritabanı nesnesi için sordu.
SqlWorldWide

@SqlWorldWide - ancak kabul edilen cevap sahip olunan veritabanlarını içermez, bu nedenle bu cevap ayrıca yararlıdır. (İlginç bir şekilde, buraya döndürülen 'Sahip' adları, kabul edilen yanıtta başvurulan sys.database_principals tablosunda bile mevcut değil. Neler olduğunu bilmek
isterim

2

İşler için, sahibi bir grubun parçası olabileceği ve girişlerde bulunmadığı için syslogins kullanamazsınız. Aşağıdakileri kullanın

select msdb.[dbo].[SQLAGENT_SUSER_SNAME](owner_sid), * 
from msdb.dbo.sysjobs
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.