¿Cómo puedo saber qué procedimiento almacenado o disparador está usando una tabla en SQL Server 2008 R2?

9

Este es el caso de que en la base de datos que estoy verificando, hay una tabla de archivo que mantiene el historial del usuario, y hay un procedimiento de activación o almacenamiento que, después de un tiempo, elimina filas de esta tabla, para evitar el sobredimensionamiento de la tabla. mismo, no diseñé la base de datos, solo estoy haciendo el mantenimiento de una aplicación que usa esta base de datos, así que no sé el nombre de estos procedimientos almacenados o disparadores, lo que quiero hacer es localizar este procedimiento almacenado o disparador, verifique el código y modifíquelo para dejar este "historial de usuario" más tiempo en la tabla.

Alguien me dijo que revisara la tabla de "sysobjects", donde realmente puedo ver algo con el mismo nombre de la tabla, pero esta es la única información que he podido recuperar, ¿algún consejo?

Gracias.

farp332
fuente

Respuestas:

6

Buscar todo el código usando sys.sql_modules

SELECT OBJECT_NAME(object_id)
FROM sys.sql_modules sm
WHERE definition LIKE '%Mytable%'

O use Red Gate SQL Search que es completamente gratis

No use syscomments o INFORMATION_SCHEMA.RUBBISH

gbn
fuente
¿No puede hacer clic con el botón derecho en la tabla de destino y presionar "Mostrar dependencias" (o algún texto en ese sentido)?
Nick Chammas
@Nick Chammas: no, esto es bien conocido como poco confiable
gbn
@gbn, entiendo que syscomments es para compatibilidad con versiones anteriores y puede eliminarse de una versión futura, pero ¿puede explicar por qué no usar INFORMATION_SCHEMA? thx
datagod
@datagod: igual por qué syscomments es siempre una mala elección: la columna de definición es nvarchar (4000). Esto significa que puede perder una referencia de tabla si está en una posición de cadena> 4000 o si abarca el límite entre las filas nvarchar (4000) (depende de cómo lo maneje, podría concat, supongo que si realmente quisiera ...
gbn
@gbn En realidad syscommentstiene varias filas para un objeto que supera el límite de 4000 caracteres, por lo que las consultas que lo utilizan son tan válidas como sys.sql_modules. sys.sql_modulesSin embargo, todavía lo recomiendo ya que syscommentsse deprecia.
Kenneth Fisher
4

Pruebe ApexSQL Search

ApexSQL Search es un complemento GRATUITO de SQL Server Management Studio y Visual Studio que, entre otras características, tiene la función Ver dependencias. La función Ver dependencias tiene la capacidad de visualizar todas las relaciones de los objetos de la base de datos SQL, incluidas aquellas entre objetos cifrados y del sistema, objetos específicos de SQL Server 2012 y objetos almacenados en bases de datos cifradas con cifrado de datos transparente (TDE)

La función Ver dependencias también le permite configurar y personalizar el diseño del diagrama de dependencias visuales, incluidas las relaciones que se presentarán, el diseño y el tamaño del diagrama generado, y la profundidad de desglose de las dependencias

Descargo de responsabilidad: trabajo para ApexSQL como ingeniero de soporte

Milica Medic
fuente
2

Para referencia futura a partir de 2008 también hay un DMV que se puede utilizar. sys.dm_sql_referencing_entities. Generalmente prefiero usar SQL_Modules ya que evita falsos positivos entre otras cosas. Lo discutí aquí, pero básicamente si tienes un código como este:

SELECT OBJECT_SCHEMA_NAME(object_id), OBJECT_NAME(object_id) 
FROM sys.sql_modules WHERE [definition] LIKE '%ABC%'

Terminará con los resultados para la tabla ABC, la tabla ABCLog la vista vw_ABC, el procedimiento almacenado sp_Update_ABC, etc. Además, que yo sepa, el DMV manejará SP cifrados y no cifrados, mientras que el método sql_modules solo funciona con SP no cifrados. .

La versión DMV de la misma consulta es esta:

SELECT * FROM sys.dm_sql_referencing_entities('dbo.ABC', 'OBJECT')
Kenneth Fisher
fuente
1

También puede usar la vista de catálogo sys.sql_expression_dependencies . Use esta consulta:

SELECT 
referencing_object_name = obj.name, 
referencing_object_type_desc = obj.type_desc, 
referenced_object_name = referenced_entity_name
FROM sys.sql_expression_dependencies sd 
INNER JOIN sys.objects obj 
ON sd.referencing_id = obj.[object_id] 
WHERE referenced_entity_name = 'MyTable'
Milica Medic
fuente