Come identificare tutte le procedure memorizzate che fanno riferimento a una tabella particolare


136

Ho creato una tabella sull'ambiente di sviluppo a scopo di test e ci sono alcune sp che stanno rifrequendo questa tabella. Ora devo eliminare questa tabella e identificare tutte le sp che si riferiscono a questa tabella. Sto incontrando difficoltà nel trovare un elenco di tutti gli sp. Si prega di suggerire alcune query ipotizzando che il nome della tabella sia 'x' e che il database sia SQL Server 2005.




1
agli esperti: che ne dici di un server SQL non MS?
Deian,

Risposte:


259
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'

A proposito: ecco una risorsa utile per questo tipo di domanda: interrogazione delle domande frequenti sul catalogo di sistema di SQL Server


3
C'è qualche motivo per farlo oltre ad accedere a ROUTINE_DEFINITIONon INFORMATION_SCHEMA.ROUTINES?
Marie,

1
@Marie - SQL-Server 2005 (AFAIK) non lo possiede.
Catene

2
Domanda, questa soluzione trova oggetti referenziati quando sono referenziati all'interno di una stringa? tipo,set @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
Jeff.Clark

1
@ Jeff.Clark - C'è un modo semplice per scoprirlo :-) - ma sì, cerca direttamente il testo della procedura, quindi lo trova.
Catene il

2
sì sì :) Mi ci sarebbe voluto un po 'di tempo per impostare il test, e stavo solo cercando una risposta pigra / facile :)
Jeff.Clark

27

Di seguito funziona su SQL2008 e versioni successive. Fornisce un elenco di entrambe le procedure e funzioni memorizzate.

select distinct [Table Name] = o.Name, [Found In] = sp.Name, sp.type_desc
  from sys.objects o inner join sys.sql_expression_dependencies  sd on o.object_id = sd.referenced_id
                inner join sys.objects sp on sd.referencing_id = sp.object_id
                    and sp.type in ('P', 'FN')
  where o.name = 'YourTableName'
  order by sp.Name

1
OP ha bisogno della risposta per SQL-Server-2005
Catene

19

a volte le query precedenti non danno risultati corretti, sono disponibili procedure memorizzate per ottenere le dipendenze della tabella come:

EXEC sp_depends @objname = N'TableName';

1
Per me, questo ha mostrato trigger e visualizzazioni ma non processi memorizzati.
NealWalters,

1
NOTA: l'ho eseguito su un sistema in cui avevo accesso ai tavoli, ma non ai Proc memorizzati, quindi ovviamente i Proc memorizzati non venivano visualizzati nel risultato.
NealWalters,

18

Un modo senza query sarebbe quello di utilizzare SQL Server Management Studio.

Individua la tabella, fai clic con il pulsante destro del mouse e scegli "Visualizza dipendenze".

MODIFICARE

Ma, come hanno detto i commentatori, non è molto affidabile.


4
Nel 2005 le informazioni sulle dipendenze non sono affidabili se gli oggetti non vengono creati nell'ordine corretto.
Martin Smith,

3
Come notato da @Martin Smith, verrà creata una procedura memorizzata che fa riferimento a un oggetto inesistente, sebbene con un avviso, ma nessuna voce verrà inserita in sysdepends. Inoltre, lo stesso vale per le procedure memorizzate che fanno riferimento a una tabella in un database esterno: nessuna voce viene mai inserita in sysdepends in entrambi i database. Un'altra caratteristica è che eliminare / ricreare una tabella o una vista interrompe la catena delle dipendenze. Queste funzionalità ... err ... rendono il tracciamento delle dipendenze di SQL Server praticamente inutile.
Nicholas Carey,

7

La query seguente recupererà tutti i nomi delle Stored procedure e la corrispondente definizione di tali SP

select 
   so.name, 
   text 
from 
   sysobjects so, 
   syscomments sc 
where 
   so.id = sc.id 
   and UPPER(text) like '%<TABLE NAME>%'

5
SELECT
    o.name
FROM
    sys.sql_modules sm
INNER JOIN sys.objects o ON
    o.object_id = sm.object_id
WHERE
    sm.definition LIKE '%<table name>%'

Tieni presente che questo farà apparire anche SP in cui il nome della tabella è nei commenti o in cui il nome della tabella è una sottostringa di un altro nome di tabella che viene utilizzato. Ad esempio, se hai tabelle denominate "test" e "test_2" e provi a cercare SP con "test", otterrai risultati per entrambi.


2
La query syscommentsin questo modo non è affidabile per le procedure lunghe poiché suddivide la definizione in blocchi di 4000 caratteri su più righe. sys.sql_modulesevita questo.
Martin Smith,

1
Buon punto. L'ho aggiornato per usarlo sys.sql_modulesinvece.
Tom H,

3
syscomments è stato smascherato in ognuna delle mie dozzine di risposte alla stessa domanda stackoverflow.com/…
gbn

5

La query seguente funziona solo quando si cercano dipendenze su una tabella e non quelle su una colonna:

EXEC sp_depends @objname = N'TableName';

Tuttavia, la seguente query è l'opzione migliore se si desidera cercare tutti i tipi di dipendenze, non manca nulla. In realtà fornisce più informazioni del necessario.

 select distinct
        so.name
        --, text 
  from 
       sysobjects so, 
       syscomments sc 
  where 
     so.id = sc.id 
     and lower(text) like '%organizationtypeid%'
  order by so.name

1
Per me, non ho restituito nulla su SSMS 2014 in esecuzione su database su SQL Server 12.0)
NealWalters

3
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'

GO

Questo funzionerà se devi menzionare il nome della tabella.


3

In Management Studio puoi semplicemente fare clic con il pulsante destro del mouse sulla tabella e fare clic su "Visualizza dipendenze" inserisci qui la descrizione dell'immagine

di quanto puoi vedere un elenco di oggetti che hanno dipendenze con la tua tabella:inserisci qui la descrizione dell'immagine


1

Hai fondamentalmente 2 opzioni:

----Opzione 1

SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'

----Opzione 2

SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'

Queste 2 query ti forniranno tutte le procedure memorizzate che fanno riferimento alla tabella che desideri. Questa query si basa su 2 tabelle sys che sono sysobject e syscomments. Gli oggetti di sistema sono i punti in cui sono memorizzati tutti i nomi degli oggetti DB, comprese le procedure memorizzate.

Il syscomments contiene il testo di tutte le procedure.

Se esegui una query: SELEZIONA * DA syscomments

Avrai una tabella contenente l'id che è il mapping alla tabella sysobjects con il testo contenuto nelle procedure memorizzate come ultima colonna.


0

Prova questo

   SELECT DISTINCT so.name
    FROM syscomments sc
    INNER JOIN sysobjects so ON sc.id=so.id
    WHERE sc.TEXT LIKE '%your table name%'
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.