Come posso sapere quale stored procedure o trigger utilizza una tabella su SQL Server 2008 R2?


9

Questo è il caso che nel DB che sto controllando, c'è una tabella di archivio che mantiene la cronologia dell'utente, e c'è un trigger o una procedura di archiviazione che dopo qualche tempo elimina le righe da questa tabella, al fine di evitare il sovradimensionamento del stesso, non ho progettato il DB, sto solo prendendo la manutenzione di un'applicazione che utilizza questo DB, quindi non conosco il nome di queste procedure memorizzate o trigger, quello che voglio fare è individuare questa procedura memorizzata o attivare, controllare il codice e modificarlo per lasciare questa "cronologia utente" più a lungo sulla tabella.

Qualcuno mi ha detto di controllare la tabella "sysobjects", dove posso effettivamente vedere qualcosa con lo stesso nome della tabella, ma questa è l'unica informazione che sono stato in grado di recuperare, qualche consiglio?

Grazie.

Risposte:


6

Cerca in tutto il codice usando sys.sql_modules

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

Oppure usa Red Gate SQL Search che è completamente gratuito

Non utilizzare syscomments o INFORMATION_SCHEMA.RUBBISH


Il collega non può anche fare clic con il pulsante destro del mouse sulla tabella di destinazione e premere "Mostra dipendenze" (o del testo in tal senso)?
Nick Chammas,

@Nick Chammas: no, questo è noto per essere inaffidabile
gbn

@gbn, capisco che i syscomments servono per la retrocompatibilità e possono essere rimossi da una versione futura, ma puoi approfondire perché non usare INFORMATION_SCHEMA? grazie
datagod

@datagod: lo stesso perché i syscomments sono sempre una cattiva scelta: la colonna di definizione è nvarchar (4000). Ciò significa che potresti perdere un riferimento alla tabella se in posizione stringa> 4000 o attraversa il confine tra le righe di nvarchar (4000) (dipende da come lo gestisci, potrei concedere, se davvero volessi ...
gbn,

@gbn In realtà syscommentsha più righe per un oggetto che supera il limite di 4000 caratteri, rendendo le query che lo utilizzano altrettanto valido sys.sql_modules. Consiglio sys.sql_modulescomunque comunque poiché syscommentsè ammortizzato.
Kenneth Fisher,

4

Prova ApexSQL Search

ApexSQL Search è un componente aggiuntivo GRATUITO di SQL Server Management Studio e Visual Studio che, tra le altre funzionalità, ha la funzione Visualizza dipendenze. La funzione Visualizza dipendenze ha la capacità di visualizzare tutte le relazioni degli oggetti del database SQL, compresi quelli tra oggetti crittografati e di sistema, oggetti specifici di SQL Server 2012 e oggetti archiviati in database crittografati con Transparent Data Encryption (TDE)

La funzione Visualizza dipendenze consente inoltre di impostare e personalizzare il layout del diagramma delle dipendenze visive, comprese le relazioni che verranno presentate, il layout e le dimensioni del diagramma generato e la profondità di drill-down delle dipendenze

Disclaimer: lavoro per ApexSQL come tecnico dell'assistenza


2

Per riferimento futuro dal 2008 esiste anche un DMV che può essere utilizzato. sys.dm_sql_referencing_entities. In genere lo preferisco all'utilizzo di SQL_Modules in quanto evita tra l'altro falsi positivi. Ne ho discusso qui ma fondamentalmente se hai un pezzo di codice come questo:

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

Finirai con i risultati per la tabella ABC, la tabella ABCLog la vista vw_ABC, la procedura memorizzata sp_Update_ABC ecc. Inoltre, per quanto ne so, il DMV gestirà SP crittografati e non crittografati mentre il metodo sql_modules funziona solo con SP non crittografati .

La versione DMV della stessa query è questa:

SELECT * FROM sys.dm_sql_referencing_entities('dbo.ABC', 'OBJECT')

1

Inoltre è possibile utilizzare la vista del catalogo sys.sql_expression_dependencies . Usa questa query:

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'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.