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.