Czy mogę odzyskać wszystkie obiekty bazy danych należące do konkretnego użytkownika?

16

Mamy użytkownika, który odchodzi i muszę znać każdy obiekt bazy danych, który posiada. Czy istnieje zapytanie, które dostarczy tych informacji?

JHFB
źródło

Odpowiedzi:

22

To powinno zapewnić ci to, czego szukasz:

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

Otrzymasz obiekty, które są własnością twojego konkretnego użytkownika ( 'YourUser'oczywiście zamiennik ). Rodzaje obiektów pobieranych przez to zapytanie:

  • FN = funkcja skalarna SQL
  • FS = funkcja skalarna zestawu (CLR)
  • FT = funkcja wyceniana w tabeli asemblera (CLR)
  • IF = SQL wbudowana funkcja wartościowana w tabeli
  • P = procedura przechowywana SQL
  • PC = procedura składowana zestawu (CLR)
  • TA = wyzwalacz DML zestawu (CLR)
  • TF = funkcja tabeli z wartościami SQL
  • TR = wyzwalacz SQL DML
  • U = Tabela (zdefiniowana przez użytkownika)
  • V = widok
Thomas Stringer
źródło
1
(Znalazłem to podczas wyszukiwania.) Nie obejmuje to obiektów nieobjętych zakresem schematu, takich jak typy komunikatów Service Broker. Czy znasz prosty sposób na uzyskanie tych informacji bez zagłębiania się we wszystkie widoki metadanych obiektu? (Nie jestem też pewien, dlaczego ograniczyłeś typy obiektów zwracanych w tym zapytaniu, ponieważ może to wykluczać niektóre interesujące obiekty.)
Jon Seigel
Cóż, ostatecznie stworzyłem własny widok. Jeśli znasz lepsze rozwiązanie, daj mi znać.
Jon Seigel
@JonSeigel Napisałem jeden przy użyciu UNII do powyższego. Czy możesz wysłać swoje, żebym mógł porównać i ulepszyć mój?
PseudoToad
3

Aby wyświetlić wszystkich właścicieli baz danych innych niż sa:

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

Jeśli potrzebujesz Właścicieli zadań systemu 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
źródło
1
Pytanie zadawane dla każdego obiektu bazy danych, a nie tylko dla samej bazy danych.
SqlWorldWide
@SqlWorldWide - ale zaakceptowana odpowiedź nie obejmuje posiadanych baz danych, więc ta odpowiedź jest dodatkowo pomocna. (Co ciekawe, zwrócone tutaj nazwiska „Właściciela” nawet nie istnieją w tabeli sys.database_principals, do której odwołuje się zaakceptowana odpowiedź. Chciałbym wiedzieć, co się dzieje.)
youcantryreachingme 17.09.19
2

W przypadku zadań nie można używać syslogins, ponieważ właściciel może być częścią grupy i nie istnieć w loginach. Skorzystaj z poniższych

select msdb.[dbo].[SQLAGENT_SUSER_SNAME](owner_sid), * 
from msdb.dbo.sysjobs
Soczyste Mięsa
źródło