Wie kann ich feststellen, welche gespeicherte Prozedur oder welcher Trigger eine Tabelle in SQL Server 2008 R2 verwendet?


9

Dies ist der Fall, wenn es in der von mir überprüften Datenbank eine Archivtabelle gibt, die den Benutzerverlauf speichert, und es gibt eine Trigger- oder Speicherprozedur, die nach einiger Zeit Zeilen aus dieser Tabelle löscht, um die Übergröße der zu vermeiden Ebenso habe ich die Datenbank nicht entworfen. Ich übernehme nur die Wartung einer Anwendung, die diese Datenbank verwendet. Daher kenne ich den Namen dieser gespeicherten Prozeduren oder Trigger nicht. Ich möchte diese gespeicherte Prozedur suchen oder auslösen, den Code überprüfen und ändern, um diesen "Benutzerverlauf" länger in der Tabelle zu belassen.

Jemand sagte mir, ich solle die Tabelle "sysobjects" überprüfen, in der ich tatsächlich etwas mit dem gleichen Namen der Tabelle sehen kann, aber dies ist die einzige Information, die ich abrufen konnte.

Danke.

Antworten:


6

Durchsuchen Sie den gesamten Code mit sys.sql_modules

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

Oder verwenden Sie die völlig kostenlose Red Gate SQL-Suche

Verwenden Sie keine syscomments oder INFORMATION_SCHEMA.RUBBISH


Kann der Gefährte nicht auch mit der rechten Maustaste auf die Zieltabelle klicken und auf "Abhängigkeiten anzeigen" (oder einen entsprechenden Text) klicken?
Nick Chammas

@ Nick Chammas: Nein, das ist bekannt als unzuverlässig
gbn

@gbn, ich verstehe, dass syscomments der Abwärtskompatibilität dient und möglicherweise aus einer zukünftigen Version entfernt wird. Können Sie jedoch erläutern, warum Sie INFORMATION_SCHEMA nicht verwenden sollten? thx
datagod

@datagod: Gleiches, warum Syscomments wie immer eine schlechte Wahl sind: Die Definitionsspalte ist nvarchar (4000). Diese Mittel können Sie eine Tabelle Bezug vermissen , wenn in der Stringposition> 4000 oder erstreckt sich über die Grenze zwischen nvarchar (4000) Zeilen (davon abhängt , wie Sie damit umgehen, könnte concat ich nehme an, wenn Sie wirklich ... wollte
GBN

@gbn Hat tatsächlich syscommentsmehrere Zeilen für ein Objekt, das die 4000-Zeichen-Grenze überschreitet, sodass Abfragen, die es verwenden, genauso gültig sind wie sys.sql_modules. Ich empfehle es sys.sql_modulesjedoch weiterhin, da syscommentses abgeschrieben wird.
Kenneth Fisher

4

Probieren Sie ApexSQL Search aus

ApexSQL Search ist ein KOSTENLOSES SQL Server Management Studio- und Visual Studio-Add-In, das unter anderem über die Funktion "Abhängigkeiten anzeigen" verfügt. Mit der Funktion "Abhängigkeiten anzeigen" können alle Beziehungen von SQL-Datenbankobjekten angezeigt werden, einschließlich der Beziehungen zwischen verschlüsselten und Systemobjekten, SQL Server 2012-spezifischen Objekten und Objekten, die in mit Transparent Data Encryption (TDE) verschlüsselten Datenbanken gespeichert sind.

Mit der Funktion "Abhängigkeiten anzeigen" können Sie auch das Layout des visuellen Abhängigkeitsdiagramms einrichten und anpassen, einschließlich der dargestellten Beziehungen, des Layouts und der Größe des generierten Diagramms sowie der Drilldown-Tiefe der Abhängigkeiten

Haftungsausschluss: Ich arbeite für ApexSQL als Support Engineer


2

Zum späteren Nachschlagen ab 2008 gibt es auch einen DMV, der verwendet werden kann. sys.dm_sql_referencing_entities. Ich bevorzuge es im Allgemeinen, SQL_Modules zu verwenden, da es unter anderem Fehlalarme vermeidet. Ich habe es hier besprochen, aber im Grunde genommen, wenn Sie einen Code wie diesen haben:

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

Sie erhalten Ergebnisse für die Tabelle ABC, die Tabelle ABCLog, die Ansicht vw_ABC, die gespeicherte Prozedur sp_Update_ABC usw. Nach meinem besten Wissen verarbeitet die DMV sowohl verschlüsselte als auch unverschlüsselte SPs, während die Methode sql_modules nur mit unverschlüsselten SPs funktioniert .

Die DMV-Version derselben Abfrage lautet wie folgt:

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

1

Sie können auch die Katalogansicht sys.sql_expression_dependencies verwenden . Verwenden Sie diese Abfrage:

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'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.