¿Cómo puedo obtener una lista de las tablas afectadas por un conjunto de procedimientos almacenados?

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

  •  02-07-2019
  •  | 
  •  

Pregunta

Tengo una enorme base de datos con alrededor de 100 tablas y unos 250 procedimientos almacenados.Quiero saber la lista de las tablas afectadas por un subconjunto de los procedimientos almacenados.Por ejemplo, tengo una lista de 50 procedimientos almacenados, de los 250, y quiero saber la lista de tablas que serán afectados por estos 50 procedimientos almacenados.¿Hay alguna forma fácil de hacer esto, aparte de la lectura de todos los procedimientos almacenados y encontrar la lista de tablas manualmente?

PS:Estoy utilizando SQL Server 2000 y SQL Server 2005 este tipo de cliente.

¿Fue útil?

Solución

Esta sería la consulta de 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 esto ayude a alguien.

Otros consejos

sp_depends 'StoredProcName' devolverá el nombre del objeto y el tipo de objeto que el procedimiento almacenado depende.

EDITAR: Me gusta @KG respuesta mejor.Más flexible en mi humilde opinión.

Yo lo haría de esta manera en SQL 2005 (quite el comentario de la "Y" de la línea si sólo lo quieren para un determinado proc):

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

Uno muy invasiva opción sería conseguir un duplicado de la base de datos y establecer un disparo en cada tabla los registros que algo sucedió.A continuación, ejecute todos los SP.Si usted no puede hacer un montón de mods para la DB que no funcionan

También, asegúrese de agregar el registro a la existente desencadena en lugar de reemplazarlos con el registro si usted también desea tablas que el SP del efecto a través de disparadores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top