Wie kann ich Tabellen ausblenden / deaktivieren, ohne sie fallen zu lassen, um die Redundanz zu überprüfen?

12

Ich muss ein altes Altsystem warten und erweitern, das Webservice-Methoden und Datenbanktabellen enthält, die nicht mehr verwendet werden. Da ich nicht ganz sicher bin, ob die Tabellen wirklich redundant sind, habe ich Angst, sie fallen zu lassen.

Gibt es eine andere Möglichkeit, den gleichen Effekt zu erzielen (Tabellen können nicht mehr verwendet werden), ohne sie fallen zu lassen? Meine Idee war, sie in ein anderes Schema (z. B. Deleted) als das aktuelle Standardschema zu übertragen dbo.

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Deleted')
BEGIN
   EXEC('CREATE SCHEMA Deleted')
END

ALTER SCHEMA Deleted TRANSFER dbo.TableName;

Gibt es eine andere Option oder gibt es irgendwelche Nachteile beim Schema-Ansatz?

Tim Schmelter
quelle

Antworten:

7

Gibt es eine andere Möglichkeit, dies zu erreichen (Tabellen können nicht mehr verwendet werden), ohne sie fallen zu lassen?

Eine Schemaänderung ist eine sehr schnelle Operation - nur eine Änderung der Metadaten ist erforderlich. Die ursprüngliche Idee stammt aus Aaron Bertrands Blog - Schema Switch-A-Roo .

Sie können die Schritte von meiner Antwort hier folgen

Offensichtlich gibt es andere Methoden wie sp_rename N'old table ', N'new table' oder verweigern einfach die Berechtigungen für die Tabelle.

Kin Shah
quelle
Ich war mir nicht sicher, welche Antwort ich annehmen sollte, weil alle hilfreich sind. Ich kannte Aarons Artikel nicht und habe ihn daher akzeptiert, da er mehr Informationen enthält (auch wenn er nur verlinkt ist).
Tim Schmelter
@ TimSchmelter Schön, dass Sie es nützlich fanden. Es macht keinen Sinn, hier zu wiederholen, was der Artikel oder meine Antwort (verlinkt). Deshalb habe ich darauf verwiesen.
Kin Shah
12

Sie können die Tabellen auch einfach umbenennen oder den Clustered-Index deaktivieren, wenn sie über Clustered-Indizes verfügen.

Chad Mattox
quelle
Vielen Dank. Ich wusste nicht, dass das Deaktivieren eines Clustered-Index die Tabelle unbrauchbar macht. Was sind die Vor- und Nachteile dieser Ansätze (+ Schema)?
Tim Schmelter
5
@TimSchmelter Wenn Sie das CI deaktivieren möchten, müssen Sie den Index neu erstellen, um es wieder zu aktivieren. Eine andere Möglichkeit besteht darin, der öffentlichen Rolle Berechtigungen für die Tabelle zu verweigern, obwohl Datenbankbesitzer oder Systemadministratoren diese weiterhin sehen und möglicherweise auch durch Verkettung der Eigentumsrechte.
Martin Smith
Bevor ich eine Tabelle lösche oder eine Spalte aus einer Tabelle lösche, benenne ich sie oft um, indem ich "_deprecated" oder etwas Ähnliches an das Ende des Namens füge. Wenn dann keine Fehler vorliegen, darf nichts darauf verweisen.
Jay
Berechtigungsänderungen sind ungewöhnlich. Handelt es sich bei dem Dienstkonto, auf dem eine Anwendung ausgeführt wird, um den dbo oder noch schlimmer um den sysadmin, wird jede Art von DENY vollständig ignoriert. Hoffentlich nicht, aber es passiert.
Kenneth Fisher
6

Entfernen Sie die Berechtigungen für die Tabelle aus den Rollen / Gruppen / Konten, die [möglicherweise] verwendet werden.

Wenn irgendetwas in die Luft sprengt, lege sie [schnell] zurück.

Tipp: Die Verwendung eines Skripts, um diese Änderungen vorzunehmen, wäre eine wirklich sehr gute Idee.

Phill W.
quelle
Wie würde auf einer Nicht-Produktionsdatenbank testen. ;) Hoffentlich war das für das OP jedoch offensichtlich.
jpmc26
@ jpmc26. Ich werde zuerst in einer Nicht-Produktionsdatenbank testen. Das Problem ist aber, dass ich wissen möchte, ob Funktionen oder Datenbankobjekte von außen verwendet werden (nicht nur über Webservice-Methoden, sondern auch direkt über die Datenbank oder Admin-Tools an anderen Standorten des Unternehmens).
Tim Schmelter
Hm. Wenn Sie direkten DB-Zugriff durch DBAs suchen, scheint die Protokollierung in Ordnung zu sein. Es ist möglicherweise nicht sehr wahrscheinlich, dass Sie die gleiche Verwendung in Prod und Non-Prod aus manueller Arbeit sehen. Ich bin mir nicht sicher, wie einfach es wäre, diese Vorgänge zu protokollieren, aber wenn Sie ein Anmelde-Produkt hätten, könnten Sie es analysieren, um nach Verwendungen zu suchen.
jpmc26
@ jpmc26: Es ist in Ordnung, wenn diese Admins auf ihr Gesicht fallen, werden sie es melden. Für Kunden nicht in Ordnung, kann aber vor dem Rollout auf dem Testsystem überprüft werden.
Tim Schmelter
3

Das Entfernen von Berechtigungen funktioniert im Allgemeinen nicht, da Sie nicht BESTIMMT sein können, dass jemand keine Berechtigungen hat. Möglicherweise durch eine Gruppe, eine Rolle oder sogar, weil sie Sysadmin sind (obwohl wir es nicht hoffen).

Für Tabellen können Sie diese deaktivieren. Und das ist ein schneller Prozess. Um sie zu aktivieren, müssen Sie sie jedoch neu erstellen und für einen großen Tisch, der einige Zeit in Anspruch nehmen kann.

Am besten verschieben Sie das Objekt in ein neues Schema (wie von Ihnen vorgeschlagen) oder benennen das Objekt um. Beide Vorgänge sind schnell und einfach durchzuführen und rückgängig zu machen. Die Berechtigungen bleiben auch in beide Richtungen erhalten.

Ein weiterer Schritt, den Sie ausführen können, ist das Hinzufügen einer "TBD-Notiz" in den erweiterten Eigenschaften des Objekts. Sie können notieren, wann Sie die Änderung vorgenommen haben und / oder welche Gründe Sie haben, warum Sie sich sicher fühlen, sie loszuwerden.

Alles in allem würde ich einige Tage lang eine erweiterte Ereignissitzung (oder einen Profiler-Trace) ausführen, um sicherzustellen, dass alle verwendeten Objekte vorhanden sind. Sie können die Sitzung stark auf den Objektnamen und den Zeitpunkt beschränken, zu dem er berührt wurde, um den Overhead zu verringern. Stellen Sie außerdem sicher, dass Sie diese Sitzung zu beiden Seiten des Monats und möglicherweise sogar zum Ende des Quartals einige Tage lang ausführen, um sicherzustellen, dass Sie über alles verfügen.

Kenneth Fisher
quelle
3

Entfernen Sie die Berechtigungen, wie von Phil W. vorgeschlagen.

Entfernen Sie auch die Berechtigungen von gespeicherten Prozeduren, die die Tabellen verwenden. In SQL Server werden Berechtigungen von einem aufrufenden Objekt (z. B. der gespeicherten Prozedur) an das aufgerufene Objekt (z. B. eine Tabelle) gekettet.

Peter Bill
quelle
Die Aufgabe bestand darin, alle Tools, Funktionen, Objekte und Abfragen (auch in entfernten Datenbanken) fehlschlagen zu lassen, die versuchen, auf diese Tabellen zuzugreifen. Wenn ich eine gespeicherte Prozedur ändern muss, muss ich bereits wissen, dass es es verwendet. Oder gibt es eine einfache Möglichkeit, festzustellen, ob eine Tabelle von einer gespeicherten Prozedur verwendet wird?
Tim Schmelter
Ich habe nicht vorgeschlagen, die gespeicherte Prozedur zu ändern, sondern nur ihre EXECUTE-Berechtigung zu entfernen. Wie Sie sagen, ist es einfach, die Berechtigung bei Bedarf wiederherzustellen. Sie können sehen, welche Tabellen von einer gespeicherten Prozedur verwendet werden: Wählen Sie in SQL Server Management Studio im Objekt-Explorer Ihre Datenbank aus -> Programmierbarkeit -> Gespeicherte Prozeduren. Klicken Sie mit der rechten Maustaste auf einen Sproc-Namen und wählen Sie Abhängigkeiten anzeigen. Wählen Sie Objekte aus, von denen [Sproc-Name] abhängt.
Peter Bill