Kann ich alle Datenbankobjekte eines bestimmten Benutzers abrufen?

16

Wir haben einen Benutzer, der geht, und ich muss jedes Datenbankobjekt kennen, das ihm gehört. Gibt es eine Abfrage, die diese Informationen bereitstellt?

JHFB
quelle

Antworten:

22

Dies sollte Ihnen helfen, wonach Sie suchen:

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

Dadurch werden Objekte abgerufen, die Ihrem bestimmten Benutzer gehören ( 'YourUser'natürlich als Ersatz ). Folgende Objekttypen werden von dieser Abfrage abgerufen:

  • FN = SQL-Skalarfunktion
  • FS = Assembly (CLR) Skalarfunktion
  • FT = Assembly (CLR) Tabellenwertfunktion
  • IF = SQL-Inline-Tabellenwertfunktion
  • P = Gespeicherte SQL-Prozedur
  • PC = Assembly (CLR) gespeicherte Prozedur
  • TA = Assembly (CLR) -DML-Trigger
  • TF = SQL-Tabellenwertfunktion
  • TR = SQL-DML-Trigger
  • U = Tabelle (benutzerdefiniert)
  • V = Ansicht
Thomas Stringer
quelle
1
(Wurde durch Suchen ermittelt.) Dies schließt Objekte ohne Schema-Bereich, wie z. B. Service Broker-Nachrichtentypen, nicht ein. Kennen Sie eine einfache Methode, um diese Informationen abzurufen, ohne in alle spezifischen Objektmetadatenansichten zu greifen? (Ich bin mir auch nicht sicher, warum Sie die in dieser Abfrage zurückgegebenen
Jon Seigel,
Nun, am Ende habe ich meine eigene Sicht geschaffen. Wenn Sie eine bessere Lösung kennen, lassen Sie es mich bitte wissen.
Jon Seigel
@ JonSeigel Ich habe einen mit einer UNION zu den oben genannten geschrieben. Kannst du deine posten, damit ich meine vergleichen und verbessern kann?
PseudoToad
3

So zeigen Sie alle Nicht-Sa-Datenbankbesitzer an:

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

Wenn Sie SQL-System-Jobbesitzer benötigen:

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
quelle
1
Frage für jedes Datenbankobjekt und nicht nur die Datenbank selbst gestellt.
SqlWorldWide
@SqlWorldWide - die akzeptierte Antwort enthält jedoch keine Datenbanken, sodass diese Antwort zusätzlich hilfreich ist. (Interessanterweise sind die hier zurückgegebenen 'Owner'-Namen nicht einmal in der Tabelle sys.database_principals vorhanden, auf die in der akzeptierten Antwort verwiesen wird. Würde gerne wissen, was los ist.)
youcantryreachingme