Wie kann ich Datenbankabhängigkeiten verfolgen?


37

Da sich interne Anwendungen über mehrere Jahre hinweg weiterentwickeln, gibt es gelegentlich eine Reihe von Tabellen, von denen die Leute glauben, dass sie nicht mehr relevant sind und aussortiert werden möchten. Welche praktischen Methoden gibt es, um Datenbankabhängigkeiten sowohl innerhalb der SQL-Umgebung als auch in Sachen SSIS zu identifizieren?

Ich habe an Orten gearbeitet, an denen ziemlich brutale Optionen ergriffen wurden, wie zum Beispiel:

  • Zuerst löschen, später Fragen stellen (kann einen Data Warehouse-Build beenden, wenn versucht wird, eine nicht mehr vorhandene Tabelle zu extrahieren)
  • Entfernen Sie zuerst die Berechtigungen und warten Sie, bis die Fehler gemeldet wurden (dies kann zu unbeaufsichtigten Fehlern führen, wenn der Fehler nicht richtig behandelt wird).

Ich weiß zu schätzen, dass SQL Server mit Tools zum Verfolgen von Abhängigkeiten in dieser Instanz geliefert wird, aber diese scheinen Probleme zu haben, wenn Sie Datenbanken in verschiedenen Instanzen haben. Gibt es Optionen, die das Abfragen von Abhängigkeiten vereinfachen, z. B. das Beantworten von Fragen wie "Wo wird diese Spalte verwendet?" mit Antworten wie "Over auf diesem anderen Server in dieser gespeicherten Prozedur" oder "Over in diesem SSIS-Paket"?

Antworten:


14

Es gibt keine einfache Möglichkeit, dies zu tun. Trigger funktionieren nicht, als ob Sie aus einer Tabelle auswählen, dass kein Trigger ausgelöst wird. Der beste Weg, dies zu tun, besteht darin, die Entwickler nachverfolgen zu lassen, was sie verwenden. Wenn etwas fallen gelassen wird, überprüfen Sie alle Entwickler-Teams und benennen Sie das Objekt um, nachdem sich alle abgemeldet haben. Geht dann für einen Monat oder bis nichts kaputt, kann das Objekt gefahrlos fallen gelassen werden.


7
  1. Suchcode für die Verwendung mit sys.sql_modules.definition: Wird darauf verwiesen? Dann...
  2. Überprüfen Sie die Berechtigungen: Welcher Client-Code kann dies aufrufen? Dann...
  3. Profiler

Somit:

  • Für eine Tabelle ohne Verweis und ohne Berechtigungen wird sie nicht verwendet.
  • Führen Sie den Profiler ohne Verweise und mit einigen Berechtigungen aus, um die Verwendung anzuzeigen
  • Fügen Sie ohne Berechtigungen und Verweise die Protokollierung der Verwendung hinzu

Was ich vorher getan habe, ist, die Tabelle zu einer Sicht zu machen, die die Tabelle maskiert, und dann die Sicht schlecht zu machen: Sie entfernen es nicht wirklich, aber Sie erzeugen Client-Timeouts oder Beschwerden ...


6

Eine schnelle Methode, die ich in der Vergangenheit verwendet habe (und die wirklich von der Größe der Tabellen, der Anzahl der Indizes usw. abhängt), ist das Hinzufügen eines Auslösers, der einen Zeitstempel protokolliert, wenn eine Aktion für die Tabelle ausgeführt wird. Wie ich bereits sagte, kann dies zu Leistungsproblemen führen. Seien Sie daher vorsichtig. Beachten Sie auch, dass in Ihrer Protokollierungstabelle keine Identitätsfelder verwendet werden, da dies zu Fehlern bei altem Code führen kann, der @@ IDENTITY verwendet. Natürlich kann es nur zeigen, dass eine Funktion in einer Anwendung seit einiger Zeit nicht mehr verwendet wurde.

Es ist sehr schwierig, Abhängigkeiten zu verfolgen, wenn sich der gesamte Code, der möglicherweise auf die Datenbank trifft, nicht in der Datenbank befindet, dh wenn zufällige Clients die Datenbank abfragen.

BEARBEITEN: Um den Punkt zu beheben, an dem eine Tabelle keine SELECT-Trigger haben kann, ist hier eine andere Option, die funktionieren sollte, vorausgesetzt, Ihre Tabellen haben Indizes (nur in 2008 getestet).

SELECT          
    last_user_seek,
    last_user_scan,
    last_user_lookup,
    last_user_update
FROM
    sys.dm_db_index_usage_stats AS usage_stats
INNER JOIN
sys.tables AS tables ON tables.object_id = usage_stats.object_id
WHERE
    database_id = DB_ID() AND
    tables.name = 'mytable' 

Beachten Sie jedoch, dass die Tabelle mit den Verwendungsstatistiken gelöscht wird, wenn der Server neu gestartet, getrennt usw. wird. Sie müssten also einen Job einrichten, um die Daten zu erfassen. Ich weiß, ein bisschen hacken.


4

Eine Möglichkeit, die ich in der Vergangenheit genutzt habe, bestand darin, eine Kandidatenliste von Tabellen zu erstellen, diese zu entfernen, umzubenennen und nach Fehlern zu suchen.

Wie ich die Liste aufstellte, war:

  1. Sehen Sie, welche Tabellen in aktuellen gespeicherten Prozeduren, Triggern und Funktionen nicht verwendet werden

  2. leere Tabellen (keine Datensätze);

  3. nicht referenzierte Tabellen (Tabellen, die keine Beziehungen haben);

  4. Sehen Sie, welche Tabellen seit dem Start des DB-Servers (DMVs) nicht verwendet wurden.

Nachdem ich die Liste in einer Textdatei erstellt hatte, erstellte ich ein Stapelskript, mit dem unsere .cs-Dateien (wir haben nur .net-Projekte) aus dem lokal zugeordneten Versionskontrollordner analysiert und überprüft wurden, ob diese Tabellen in den .cs-Dateien verwendet werden ( sollte nicht passieren, aber hey .. Ich hatte Überraschungen). Wenn nein, dann ist es klar, wenn ja, dann erstellen wir eine Liste und geben den Entwicklern die Möglichkeit zu prüfen, ob dieses Modul noch verwendet wird.

Kurz gesagt, die Vorgänger haben Recht, es gibt keine Silberkugel.


3

Die Richtlinie, die ich in meinem Unternehmen implementiere, besteht darin, alles, was mit SQL Server zu tun hat, an einem zentralen Ort der Quellcodeverwaltung zu unterziehen.

  • asp.net projekte
  • SSRS-Projekte
  • SSIS-Projekte
  • Ich schreibe sogar alle Datenbankobjekte in eine Art Repository aus.

Ich habe es noch nicht eingerichtet, aber irgendwann möchte ich eine Art Index- / zentralen Suchmechanismus implementieren, mit dem ich nach bestimmten Tabellen, Sprocs usw. suchen kann. Wir sind tatsächlich ein neuer SQL Server-Shop - der von FoxPro konvertiert . Alte SQL-Objekte sind also noch kein großes Problem, aber ich plane für die Zukunft.

Das Problem, das ich beim Umbenennen / Verfolgen sehe, ist, dass einige Dinge nur jährlich und nicht einmal jedes Jahr ausgeführt werden. Ganz zu schweigen von den verschiedenen Ad-hoc-Dingen, zu denen Sie aufgefordert werden, und die Sie Monate oder Jahre später erneut anfordern.


3

Es gibt eine Vielzahl von Werkzeugen und Techniken zum Verfolgen von Abhängigkeiten, darunter:

Tools, die ich kenne:

  • SQL Server-Abhängigkeitsanzeige (kann jedoch Probleme verursachen, wenn sp using table erstellt wurde, bevor die Tabelle erstellt wurde)
  • Redgate SQL Dependency Tracker (über die Antwort von @Eric Humphrey)
  • Resharper (.net-Tool, mit dem sich Aufrufpfade anzeigen lassen. Ich denke, es kann verwendet werden, um zu verfolgen, wo wichtige SQL-Aufrufe verwendet werden.)

Methoden

  • Codesuche für die Verwendung von SQL-Objekten (repliziert jedoch einige der oben genannten Tools)
  • Schauen Sie sich die Nutzungsstatistik an (dh wann wurde ein SQL-Objekt zuletzt aufgerufen), ich verwende die folgende SQL:

    SELECT 
        last_execution_time,   
        (SELECT TOP 1 
            SUBSTRING(s2.text,statement_start_offset / 2+1 , 
                ((CASE WHEN statement_end_offset = -1 THEN 
                    (LEN(CONVERT(nvarchar(max),s2.text)) * 2) 
                ELSE statement_end_offset END) - statement_start_offset) / 2+1)
        )  AS sql_statement,
        execution_count
    FROM sys.dm_exec_query_stats AS s1 
    CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2  
    WHERE 
        s2.text like '%[OBJECT NAME]%' 
        and last_execution_time > [DATE YOU CARE ABOUT]
    ORDER BY last_execution_time desc

Hinweis : Die Tabelle mit den Verwendungsstatistiken wird gelöscht, wenn der Server neu gestartet, getrennt usw. wird. Sie müssten also einen Job einrichten, um die Daten zu erfassen. Ich weiß, ein bisschen hacken. (von @Miles D)

Techniken

  • Suche nach letzter Nutzung (siehe Nutzungsstatistik oben)
  • Suche nach Verwendungszweck (siehe Tools)
  • Code-Nutzung mit Entwicklern überprüfen (über @ MrDenny)
  • Benennen Sie das Objekt um (z. B. post / prefix mit _toBeDropped) und achten Sie auf Fehler
  • Ändern Sie die Berechtigungen und achten Sie auf Fehler
  • Objekt fallen lassen und beten

2

Vor einigen Jahren habe ich versucht, ein Tool zu bauen, um ähnliche Dinge zu überprüfen. Die TL; DR-Antwort ist, dass ich es zu diesem Zeitpunkt nicht möglich fand, mit den verfügbaren Ressourcen umzugehen.

Wo wird diese Spalte verwendet?

Diese Frage wird noch komplizierter, wenn Sie feststellen, dass eine Reihe von Abfragen, Ansichten und gespeicherten Prozeduren in select *der Tabelle verwendet werden, in der sich die Spalte befindet. Dann müssen Sie sich die Programme ansehen, die diese Ergebnisse verwenden - Sie benötigen also einen Scanner / Indexer / Parser in der Lage, Quellcode zu lesen, der C #, Delphi, Java, VB, ASP (klassisch) usw. sein kann, nur um zu versuchen, jeden Verweis auf diese Spalte zu finden. Dann müssen Sie diese Programme analysieren, um festzustellen, ob dieser Code überhaupt noch aufgerufen wird.



2

Dies ist keine wirkliche Antwort auf Ihre Frage, aber ich denke, es sollte erwähnt werden: Dies ist ein Grund, warum alle Systeme außerhalb Ihrer Datenbank über Views und Sprocs kommunizieren sollten . Sie haben die Build-Skripte für diese in durchsuchbaren .sql-Dateien, sodass Sie leicht sehen können, ob eine bestimmte Tabelle oder Spalte extern verwendet wird.

Natürlich stellt SSIS normalerweise eine direkte Verbindung zu Tabellen her, daher ist dies im Moment wahrscheinlich keine große Hilfe für Ihre Bedürfnisse. Wenn Entwickler eine Verbindung zu Ihrer Datenbank herstellen und sich darüber beschweren, dass sie warten müssen (oder wer auch immer als DBA fungiert), um die Ansichten und Sprocs zu erstellen, die sie benötigen, können Sie ihnen mitteilen: "Jede Tabelle oder Spalte kann gelöscht oder umbenannt werden. I ' Ich bin lediglich verpflichtet, Sie über Änderungen an Ansichten und Sprocs auf dem Laufenden zu halten. " Und sie müssen nur Regressionstests für diese spezifischen Änderungen durchführen.


0

TSQL Folgendes kann verwendet werden: sys.dm_sql_referencing_entities oder sys.sql_expression_dependencies

Alternativ können Tools wie SQL Negotiator Pro, Redgate usw. dies mithilfe einer grafischen Benutzeroberfläche visuell für Sie generieren

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.