Posso recuperare tutti gli oggetti di database di proprietà di un determinato utente?


16

Abbiamo un utente che sta partendo e ho bisogno di conoscere tutti gli oggetti di database che possiede. Esiste una query che fornirà queste informazioni?

Risposte:


22

Questo dovrebbe darti quello che stai cercando:

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

Ciò otterrà oggetti di proprietà del tuo particolare utente (in sostituzione 'YourUser'ovviamente). I tipi di oggetti che questa query estrae sono:

  • FN = funzione scalare SQL
  • FS = Funzione scalare di assemblaggio (CLR)
  • FT = Funzione con valori di tabella Assembly (CLR)
  • IF = SQL inline con valori di tabella
  • P = SQL Stored Procedure
  • PC = procedura memorizzata Assembly (CLR)
  • TA = trigger DML Assembly (CLR)
  • TF = funzione valutata a tabella SQL
  • TR = trigger DML SQL
  • U = Tabella (definita dall'utente)
  • V = Visualizza

1
(È stato trovato tramite la ricerca.) Ciò non include gli oggetti non con ambito schema come i tipi di messaggi di Service Broker. Conosci un modo semplice per ottenere tali informazioni senza scavare in tutte le viste specifiche dei metadati degli oggetti? (Inoltre, non sono sicuro del motivo per cui hai limitato i tipi di oggetti restituiti in questa query, in quanto potrebbero escludere alcuni oggetti di interesse.)
Jon Seigel

Bene, ho finito per creare il mio punto di vista. Se conosci una soluzione migliore, faccelo sapere.
Jon Seigel,

@JonSeigel Ne ho scritto uno usando un UNION per quanto sopra. Puoi pubblicare il tuo in modo che io possa confrontare e migliorare il mio?
PseudoToad,

3

Per mostrare tutti i proprietari di database non sa:

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

Se hai bisogno di proprietari di processi del sistema 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
Domanda posta per ogni oggetto del database e non solo per il database stesso.
SqlWorldWide,

@SqlWorldWide - ma la risposta accettata non include i database di proprietà, quindi questa risposta è anche utile. (È interessante notare che i nomi di "Proprietario" restituiti qui non esistono nemmeno nella tabella sys.database_principals a cui fa riferimento la risposta accettata. Mi piacerebbe sapere cosa sta succedendo.)
youcantryreachingme

2

Per Jobs, non è possibile utilizzare syslogin poiché il proprietario potrebbe far parte di un gruppo e non esistere negli accessi. Usa il seguito

select msdb.[dbo].[SQLAGENT_SUSER_SNAME](owner_sid), * 
from msdb.dbo.sysjobs
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.