Могу ли я получить все объекты базы данных, принадлежащие конкретному пользователю?

16

У нас есть пользователь, который уходит, и мне нужно знать каждый объект базы данных, которым он владеет. Есть ли запрос, который предоставит эту информацию?

JHFB
источник

Ответы:

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 = Assembly (CLR)
  • FT = сборочная (CLR) табличная функция
  • IF = встроенная табличная функция SQL
  • P = хранимая процедура SQL
  • ПК = сборка (CLR) хранимая процедура
  • TA = сборка (CLR) DML-триггер
  • TF = табличная функция SQL
  • TR = SQL DML триггер
  • U = таблица (определяется пользователем)
  • V = Просмотр
Томас Стрингер
источник
1
(Обнаружено это с помощью поиска.) Это не включает объекты, не относящиеся к области схемы, такие как типы сообщений компонента Service Broker. Знаете ли вы о простом способе получить эту информацию, не углубляясь во все представления конкретных метаданных объекта? (Кроме того, я не уверен, почему вы ограничили типы объектов, возвращаемых в этом запросе, так как он может исключить некоторые объекты, представляющие интерес.)
Джон Зигель,
Ну, я закончил тем, что создал свой собственный взгляд. Если вы знаете лучшее решение, пожалуйста, дайте мне знать.
Джон Зигель
@JonSeigel Я написал один, используя UNION выше. Можете ли вы опубликовать свой, чтобы я мог сравнить и улучшить мой?
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
Сочное мясо
источник