Como faço para obter uma lista de tabelas afetadas por um conjunto de procedimentos armazenados?

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

  •  02-07-2019
  •  | 
  •  

Pergunta

Eu tenho um enorme banco de dados com cerca de 100 mesas e cerca de 250 procedimentos armazenados. Eu quero saber a lista de tabelas afetadas por um subconjunto de procedimentos armazenados. Por exemplo, eu tenho uma lista de 50 procedimentos armazenados, dos 250, e eu quero saber a lista de tabelas que serão afetados por estes 50 procedimentos armazenados. Existe alguma maneira fácil para fazer isso, diferente de ler todos os procedimentos armazenados e encontrar a lista de tabelas manualmente?

PS:. Estou usando o SQL Server 2000 e SQL Server 2005 clientes para esta

Foi útil?

Solução

Esta seria sua consulta 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
    )

Espero que isso ajude alguém.

Outras dicas

sp_depends 'StoredProcName' irá retornar o nome do objeto e tipo de objeto que o proc armazenados depende.

EDIT: Eu como @ resposta de KG melhor. IMHO mais flexível.

Eu faria isso dessa maneira no SQL 2005 (uncomment o "E" linha se só deseja-lo por um proc particular):

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

Uma opção muito invasiva seria a de obter um banco de dados duplicado e definir um gatilho em cada mesa que os logs que algo aconteceu. Em seguida, executar todo o SP de. Se você não pode fazer um monte de mods para o DB que não vai funcionar

Além disso, não se esqueça de adicionar o registro para gatilhos existentes em vez de substituí-los com o registo se você também quiser tabelas que o efeito do SP via triggers.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top