Bisakah saya mengambil semua objek basis data yang dimiliki oleh pengguna tertentu?

16

Kami memiliki pengguna yang pergi dan saya perlu tahu setiap objek basis data yang ia miliki. Apakah ada permintaan yang akan memberikan informasi ini?

JHFB
sumber

Jawaban:

22

Ini akan memberi Anda apa yang Anda cari:

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

Ini akan mendapatkan objek yang dimiliki oleh pengguna khusus Anda ( 'YourUser'tentu saja pengganti ). Jenis objek yang diminta oleh kueri ini adalah:

  • FN = Fungsi skalar SQL
  • FS = Majelis (CLR) fungsi skalar
  • FT = Majelis (CLR) fungsi bernilai tabel
  • IF = fungsi bernilai tabel inline SQL
  • P = Prosedur yang Disimpan SQL
  • Prosedur tersimpan PC = Assembly (CLR)
  • TA = Assembly (CLR) DML trigger
  • TF = SQL table bernilai fungsi
  • TR = SQL DML trigger
  • U = Tabel (ditentukan pengguna)
  • V = Lihat
Thomas Stringer
sumber
1
(Menemukan ini melalui pencarian.) Ini tidak termasuk objek yang tidak termasuk skema seperti jenis pesan Pialang Layanan. Apakah Anda tahu cara mudah untuk mendapatkan informasi itu tanpa menggali ke semua tampilan metadata objek tertentu? (Juga, saya tidak yakin mengapa Anda membatasi jenis objek yang dikembalikan dalam permintaan ini, karena dapat mengecualikan beberapa objek yang menarik.)
Jon Seigel
Yah, saya akhirnya menciptakan pandangan saya sendiri. Jika Anda mengetahui solusi yang lebih baik, beri tahu saya.
Jon Seigel
@ JonSeigel Saya telah menulis satu menggunakan UNION di atas. Bisakah Anda memposting milik Anda sehingga saya dapat membandingkan dan meningkatkan milik saya?
PseudoToad
3

Untuk menampilkan semua pemilik basis data non-sa:

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

Jika Anda membutuhkan pemilik sistem Pekerjaan 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
Steve
sumber
1
Pertanyaan yang diajukan untuk setiap objek basis data dan bukan hanya basis data itu sendiri.
SqlWorldWide
@SqlWorldWide - tetapi jawaban yang diterima tidak termasuk database yang dimiliki, jadi jawaban ini juga bermanfaat. (Menariknya, nama 'Pemilik' yang dikembalikan ke sini bahkan tidak ada di tabel sys.database_principals yang dirujuk dalam jawaban yang diterima. Ingin tahu apa yang terjadi.)
youcantryreachingme
2

Untuk Pekerjaan, Anda tidak dapat menggunakan syslogins karena pemiliknya dapat menjadi bagian dari grup dan tidak ada dalam login. Gunakan di bawah ini

select msdb.[dbo].[SQLAGENT_SUSER_SNAME](owner_sid), * 
from msdb.dbo.sysjobs
Daging Juicy
sumber