Puis-je récupérer tous les objets de base de données appartenant à un utilisateur particulier?


16

Nous avons un utilisateur qui part et j'ai besoin de connaître chaque objet de base de données qu'il possède. Y a-t-il une requête qui fournira ces informations?

Réponses:


22

Cela devrait vous fournir ce que vous recherchez:

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

Cela obtiendra des objets qui appartiennent à votre utilisateur particulier (substitut 'YourUser'bien sûr). Les types d'objets extraits par cette requête sont les suivants:

  • FN = fonction scalaire SQL
  • FS = fonction scalaire d'assemblage (CLR)
  • FT = fonction table (CLR) assemblée
  • IF = fonction table SQL en ligne
  • P = Procédure stockée SQL
  • PC = procédure stockée d'assemblage (CLR)
  • TA = déclencheur DML d'assemblage (CLR)
  • TF = fonction table valeur SQL
  • TR = déclencheur SQL DML
  • U = Table (définie par l'utilisateur)
  • V = Voir

1
(Trouvé par la recherche.) Cela n'inclut pas les objets non étendus au schéma tels que les types de messages Service Broker. Connaissez-vous un moyen simple d'obtenir ces informations sans creuser dans toutes les vues de métadonnées d'objet spécifiques? (De plus, je ne sais pas pourquoi vous avez limité les types d'objets renvoyés dans cette requête, car cela pourrait exclure certains objets d'intérêt.)
Jon Seigel

Eh bien, j'ai fini par créer ma propre vue. Si vous connaissez une meilleure solution, faites-le moi savoir.
Jon Seigel

@ JonSeigel J'en ai écrit un à l'aide d'un UNION ci-dessus. Pouvez-vous poster le vôtre afin que je puisse comparer et améliorer le mien?
PseudoToad

3

Pour afficher tous les propriétaires de bases de données non sa:

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

Si vous avez besoin de propriétaires de tâches système 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
Question posée pour chaque objet de base de données et pas seulement la base de données elle-même.
SqlWorldWide

@SqlWorldWide - mais la réponse acceptée n'inclut pas les bases de données possédées, donc cette réponse est également utile. (Fait intéressant, les noms de «propriétaire» renvoyés ici n'existent même pas dans la table sys.database_principals référencée dans la réponse acceptée. J'aimerais savoir ce qui se passe.)
youcantryreachingme

2

Pour les travaux, vous ne pouvez pas utiliser syslogins car le propriétaire peut faire partie d'un groupe et ne pas exister dans les connexions. Utilisez ce qui suit

select msdb.[dbo].[SQLAGENT_SUSER_SNAME](owner_sid), * 
from msdb.dbo.sysjobs
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.