Posso recuperar todos os objetos de banco de dados pertencentes a um usuário específico?


16

Temos um usuário que está saindo e preciso conhecer todos os objetos de banco de dados que ele possui. Existe uma consulta que forneça essas informações?

Respostas:


22

Isso deve fornecer o que você está procurando:

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

Isso obterá objetos pertencentes ao seu usuário em particular (substituto, é 'YourUser'claro). Os tipos de objetos que essa consulta puxa são:

  • FN = função escalar SQL
  • FS = função escalar Assembly (CLR)
  • Função com valor de tabela FT = Assembly (CLR)
  • IF = função com valor de tabela embutida SQL
  • P = SQL Stored Procedure
  • Procedimento armazenado PC = Assembly (CLR)
  • TA = gatilho DML de montagem (CLR)
  • TF = função com valor de tabela SQL
  • TR = gatilho SQL DML
  • U = Tabela (definido pelo usuário)
  • V = Visualizar

1
(Encontrei isso através da pesquisa.) Isso não inclui objetos com escopo não definido pelo esquema, como tipos de mensagens do Service Broker. Você conhece uma maneira fácil de obter essas informações sem se aprofundar em todas as visualizações de metadados de objetos específicos? (Além disso, eu não sei por que você limita os tipos de objetos retornados nesta consulta, como poderia excluir alguns objetos de interesse.)
Jon Seigel

Bem, acabei criando minha própria visão. Se você souber de uma solução melhor, entre em contato.
precisa

@ JonSeigel Eu escrevi um usando um UNION para o acima. Você pode postar o seu para que eu possa comparar e melhorar o meu?
PseudoToad

3

Para mostrar todos os proprietários de bancos de dados não-sa:

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

Se você precisar de proprietários de tarefas do 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
Pergunta feita para cada objeto de banco de dados e não apenas o próprio banco de dados.
SqlWorldWide 26/10

@SqlWorldWide - mas a resposta aceita não inclui bancos de dados de propriedade, portanto, essa resposta também é útil. (Curiosamente, nomes do 'proprietário' voltou aqui nem sequer existem na tabela de sys.database_principals referenciado na resposta aceita gostaria de saber o que está acontecendo..)
youcantryreachingme
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.