Comment obtenir une liste de tables affectées par un ensemble de procédures stockées?

StackOverflow https://stackoverflow.com/questions/119308

  •  02-07-2019
  •  | 
  •  

Question

J'ai une énorme base de données avec une centaine de tables et quelque 250 procédures stockées. Je souhaite connaître la liste des tables affectées par un sous-ensemble de procédures stockées. Par exemple, j'ai une liste de 50 procédures stockées sur 250 et je souhaite connaître la liste des tables qui seront affectées par ces 50 procédures stockées. Existe-t-il un moyen simple de le faire, mis à part la lecture de toutes les procédures stockées et la recherche manuelle de la liste des tables?

PS: J'utilise des clients SQL Server 2000 et SQL Server 2005 pour cela.

Était-ce utile?

La solution

Ce serait votre requête SQL Server:

SELECT
    [NAME]
FROM
    sysobjects
WHERE
    xType = 'U' AND --specifies a user table object
    id in
    (
        SELECT 
            sd.depid 
        FROM 
            sysobjects so,
            sysdepends sd
        WHERE
            so.name = 'NameOfStoredProcedure' AND 
            sd.id = so.id
    )

J'espère que cela aide quelqu'un.

Autres conseils

sp_depends 'StoredProcName' renvoie le nom et le type d'objet dont dépend la procédure stockée.

MODIFIER: J'aime mieux la réponse de @ KG. IMHO plus flexible.

Je le ferais de cette façon dans SQL 2005 (décommentez la ligne "AND" si vous le souhaitez uniquement pour un processus particulier):

SELECT 
    [Proc] = SCHEMA_NAME(p.schema_id) + '.' + p.name,
    [Table] = SCHEMA_NAME(t.schema_id) + '.' + t.name,
    [Column] = c.name,
    d.is_selected,
    d.is_updated
FROM sys.procedures p
    INNER JOIN  sys.sql_dependencies d
        ON  d.object_id = p.object_id
        AND d.class IN (0,1)
    INNER JOIN  sys.tables t
        ON  t.object_id = d.referenced_major_id
    INNER JOIN  sys.columns c
        ON  c.object_id = t.object_id
        AND c.column_id = d.referenced_minor_id
WHERE   p.type IN ('P')
--  AND p.object_id = OBJECT_ID('MyProc')
ORDER BY 
    1, 2, 3

Une option très invasive consisterait à obtenir une base de données dupliquée et à définir un déclencheur sur chaque table qui enregistre un événement. Puis lancez tous les SP. Si vous ne pouvez pas faire beaucoup de mods à la base de données qui ne fonctionneront pas

Veillez également à ajouter la journalisation aux déclencheurs existants plutôt que de les remplacer par la journalisation si vous souhaitez également des tables sur lesquelles l'effet du SP passe par des déclencheurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top