¿Puedo recuperar todos los objetos de la base de datos propiedad de un usuario en particular?

16

Tenemos un usuario que se va y necesito saber cada objeto de base de datos que posee. ¿Hay alguna consulta que proporcione esta información?

JHFB
fuente

Respuestas:

22

Esto debería darte lo que estás buscando:

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

Esto obtendrá objetos que son propiedad de su usuario particular (sustituto, 'YourUser'por supuesto). Los tipos de objetos que extrae esta consulta son:

  • FN = función escalar SQL
  • FS = función escalar de ensamblaje (CLR)
  • FT = Asamblea (CLR) función con valores de tabla
  • IF = función en línea de SQL con valores de tabla
  • P = Procedimiento almacenado de SQL
  • PC = Procedimiento almacenado de ensamblaje (CLR)
  • TA = Disparador DML de ensamblaje (CLR)
  • TF = función de valor de tabla SQL
  • TR = disparador DML SQL
  • U = Tabla (definida por el usuario)
  • V = Ver
Thomas Stringer
fuente
1
(Encontré esto mediante la búsqueda). Esto no incluye objetos sin ámbito de esquema, como los tipos de mensajes de Service Broker. ¿Conoces una manera fácil de obtener esa información sin profundizar en todas las vistas de metadatos de objetos específicos? (Además, no estoy seguro de por qué limitó los tipos de objetos devueltos en esta consulta, ya que podría excluir algunos objetos de interés.)
Jon Seigel
Bueno, terminé creando mi propia vista. Si conoce una solución mejor, hágamelo saber.
Jon Seigel
@ JonSeigel He escrito uno usando UNION para lo anterior. ¿Puedes publicar el tuyo para que pueda comparar y mejorar el mío?
PseudoToad
3

Para mostrar todos los propietarios de bases de datos que no son sa:

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

Si necesita propietarios de trabajos del 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
Steve
fuente
1
Pregunta hecha para cada objeto de base de datos y no solo la base de datos en sí
SqlWorldWide
@SqlWorldWide, pero la respuesta aceptada no incluye las bases de datos de propiedad, por lo que esta respuesta también es útil. (Curiosamente, los nombres del 'propietario' regresaron aquí ni siquiera existe en la tabla sys.database_principals hace referencia en la respuesta aceptada Me gustaría saber lo que está pasando..)
youcantryreachingme
2

Para los trabajos, no puede usar syslogins ya que el propietario puede ser parte de un grupo y no existir en los inicios de sesión. Usa el siguiente

select msdb.[dbo].[SQLAGENT_SUSER_SNAME](owner_sid), * 
from msdb.dbo.sysjobs
Carnes jugosas
fuente