Wie erhalte ich eine Liste von Tabellen, die von einer Reihe von gespeicherten Prozeduren betroffen?

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

  •  02-07-2019
  •  | 
  •  

Frage

Ich habe eine riesige Datenbank mit rund 100 Tabellen und rund 250 gespeicherte Prozeduren. Ich mag die Liste der Tabellen, die von einer Untergruppe von gespeicherten Prozeduren betroffen kennen. Zum Beispiel habe ich eine Liste von 50 Stored Procedures, aus 250, und ich mag die Liste der Tabellen kennen, die von diesen 50 gespeicherten Prozeduren betroffen sein wird. Gibt es eine einfache Möglichkeit, dies zu tun, anders als alle gespeicherten Prozeduren zu lesen und die Liste der Tabellen manuell zu finden?

. PS: Ich bin mit SQL Server 2000 und SQL Server 2005-Clients für diesen

War es hilfreich?

Lösung

Dies sei die SQL Server-Abfrage:

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
    )

Hoffe, das hilft jemand.

Andere Tipps

sp_depends 'StoredProcName' wird den Objektnamen und Objekttyp zurückgeben, die die gespeicherte Prozedur abhängt.

EDIT: Ich mag @ KG Antwort besser. Flexiblere IMHO.

Ich würde tun es auf diese Weise in SQL 2005 (Kommentar- der „AND“ Linie, wenn Sie es für eine bestimmte proc wollen):

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

Eine sehr invasive Option wäre eine doppelte Datenbank zu erhalten und einen Trigger auf jeden Tisch setzen, meldet, dass etwas passiert. Führen Sie dann die ganze SP. Wenn Sie nicht viele Mods an die DB tun, die Arbeit werde nicht

Auch sollten Sie die Protokollierung zu vorhandenen Trigger hinzuzufügen, anstatt zu ersetzen Sie sie durch die Protokollierung, wenn Sie auch Tabellen möchten, dass die Wirkung des SP über Trigger.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top