Чи можу я отримати всі об'єкти бази даних, що належать певному користувачеві?


16

У нас є користувач, який виїжджає, і мені потрібно знати кожен об’єкт бази даних, яким він володіє. Чи є запит, який надасть цю інформацію?

Відповіді:


22

Це має отримати те, що ви шукаєте:

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

Це отримає об’єкти, які належать вашому конкретному користувачеві (замінник, 'YourUser'звичайно). Типи об’єктів, які цей запит витягує:

  • FN = скалярна функція SQL
  • FS = скалярна функція збірки (CLR)
  • FT = функція, що оцінюється за таблицею (CLR)
  • IF = функція вбудованої таблиці в значення SQL
  • P = Збережена процедура SQL
  • PC = Зберігання (CLR) збереженої процедури
  • TA = тригер DML складання (CLR)
  • TF = функція SQL-значення з таблицею
  • TR = тригер SQL DML
  • U = Таблиця (визначена користувачем)
  • V = Перегляд

1
(Це знайдено за допомогою пошуку.) Це не включає об'єкти, що не належать до схем, наприклад типи повідомлень Broker Service. Чи знаєте ви простий спосіб отримати цю інформацію, не заглиблюючись у всі конкретні представлення метаданих об'єктів? (Крім того, я не впевнений, чому ви обмежили типи об’єктів, повернених у цьому запиті, оскільки це могло виключити деякі об'єкти, що цікавлять.)
Джон Сейгель

Що ж, я закінчив створити власний погляд. Якщо ви знаєте краще рішення, будь ласка, повідомте мене про це.
Джон Сейгель

@JonSeigel Я написав його, використовуючи Спілкування до вищезазначеного. Чи можете ви розмістити своє, щоб я міг порівняти та покращити свою?
PseudoToad

3

Щоб показати всіх власників баз даних, що не стосуються sa:

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

Якщо вам потрібні власники завдань системи 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
Питання задається кожному об'єкту бази даних, а не лише самій базі даних.
SqlWorldWide

@SqlWorldWide - але прийнята відповідь не включає бази даних, що належать їй, тому ця відповідь додатково корисна. (Цікаво, що імена "Власник", повернені сюди, навіть не існують у таблиці sys.database_principals, на яку посилається прийнята відповідь. Хочеться знати, що відбувається.)
youcantryreachingme

2

Для робочих місць ви не можете використовувати системні журнали, оскільки власник може бути частиною групи і не існувати у входах. Скористайтеся нижче

select msdb.[dbo].[SQLAGENT_SUSER_SNAME](owner_sid), * 
from msdb.dbo.sysjobs
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.