Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

7 Fakten über SQL Server-Synonyme, die Sie kennen sollten

Bevor SQL Server Synonyms erschien, wollte jeder seine Datenbankerfahrung vereinfachen und verbessern.

Stellen Sie sich vor, Sie haben eine Anwendung mit einer Datenbank, die auf eine andere Datenbank desselben Servers verweist. Dann zwingt eine größere Reorganisation Ihr Team dazu, die andere Datenbank auf einen anderen Server zu übertragen.

Es besteht kein Zweifel, dass Ihre Anwendung scheitern wird. Aber was werden Sie in diesem Fall tun? Verknüpfen Sie die 2 Server und codieren Sie alle Verweise (erneut) fest, um auf den neuen Server zu verweisen?

Sie könnten das tun, wenn Sie möchten, und vergessen, ob Sie nur ein paar oder ein Dutzend Referenzen darauf haben. Aber wenn es zu einer weiteren Übertragung oder Umbenennung kommt, müssen Sie denselben Alptraum wiederholen.

Trotzdem gibt es einen besseren Weg, damit umzugehen.

Einführung in SQL Server-Synonyme

Bevor wir uns damit befassen, was Sie mit SQL Server-Synonymen machen können, lassen Sie uns beschreiben, was sie sind.

Ein Synonym in jeder gesprochenen und geschriebenen Sprache bezieht sich auf ein Wort oder eine Phrase, die die gleiche Bedeutung wie ein anderes Wort oder eine andere Phrase hat. Also das Wort wunderschön ist das Synonym für schön und attraktiv .

Ähnlich wie wir über Synonyme von Wörtern und Ausdrücken wissen, beziehen sich SQL Server-Synonyme auf einen alternativen Namen eines Datenbankobjekts, das sich auf einem lokalen oder Remoteserver befindet. Lesen Sie hier mehr.

Wie Sie in den folgenden Fakten sehen werden, können SQL Server-Synonyme die Wartung Ihrer Anwendung erheblich vereinfachen.

Fangen wir also an!

1. SQL Server-Synonyme können Ihre Arbeit vereinfachen, wenn Stammobjekte übertragen oder umbenannt werden

Erstens ersparen sie Ihnen Codeänderungen, wenn eine Datenbank auf einen anderen Server verschoben oder aus irgendeinem Grund umbenannt wird. Lassen Sie uns auf das Szenario verweisen, das wir in dieser Beitragseröffnung erwähnt haben.

Eine größere Reorganisation zwingt Ihr Team dazu, einen Verweis auf alle Objekte in mydatabase2 zu ändern in prodserver2.mydatabase2.

Sie fragen also sys.sql_modules ab mit allen Vorkommen von mydatabase2 aus meinedatenbank1 .

USE mydatabase1
GO
SELECT
 b.name
,a.definition
,b.type_desc
FROM sys.sql_modules a
INNER JOIN sys.all_objects b on a.object_id = b.object_id
WHERE a.definition like '%mydatabase2%'
GO

Nun listet die Ausgabe des obigen Skripts alle Objekte auf, die Verweise auf mydatabase2 haben . Schön, oder? Und dies wird dabei helfen, den Umfang der zu erledigenden Arbeit zu definieren.

Aber das ist erst der Anfang. Sie müssen auch prüfen, ob es Code in Ihrer Client-App oder anderen Code gibt, der auf denselben außerhalb Ihrer Datenbank verweist.

Die Menge des betroffenen Codes zeigt, wie groß Ihr neues Problem ist.

Nun, hier sind noch ein paar Leckerbissen darüber, was in diesem Skript vor sich geht:

  • sys.sql_modules enthalten SQL-Objekte, die SQL-definierte Module wie Ansichten, gespeicherte Prozeduren, Funktionen usw. sind.
  • Der Name Spalte ist, wo der Name des Objekts steht.
  • Der SQL-Code für das Objekt befindet sich in der Definition Spalte von sys.sql_modules .
  • sys.all_objects schließen Sie alle Objekte in Ihre Datenbank ein, wie Tabellen, Ansichten usw.
  • Wir haben den type_desc genommen Spalte, um festzustellen, um welchen Objekttyp es sich handelt (Ansicht, gespeicherte Prozedur usw.)
  • Das wo -Klausel filtert die Abfrage nach SQL-Code, der einen Verweis auf mydatabase2 enthält .
  • Um mit dem obigen Skript ein zufriedenstellendes Ergebnis zu erzielen, müssen Sie die Berechtigung für alle Objekte haben. Erkundigen Sie sich diesbezüglich bei Ihrem Datenbankadministrator oder jemandem mit einer ähnlichen Rolle. Sie können dies auch überprüfen.

Jetzt, da Sie wissen, wie Sie den Umfang Ihrer Arbeit erhalten, ist es an der Zeit, ihn zu korrigieren.

So beheben Sie dieses Code-Chaos, damit es nicht wieder vorkommt

Gut. Ich muss ein Geständnis machen.

Die Verwendung von SQL Server-Synonymen wird Ihre Probleme nur auf ein Minimum reduzieren, aber nicht beseitigen.

Jetzt, da es aus dem Weg geräumt ist, hier die gute Nachricht:Wenn Sie 10 Verweise auf ein entferntes Objekt haben, bevor Sie Synonyme verwenden, ändern Sie alle 10. Aber sobald Sie beginnen, ein Synonym für dieses entfernte Objekt zu verwenden, anstatt 10 Vorkommen zu ändern, Sie ändern nur 1. Nichts weiter.

Hier sind nun die Schritte, um dies mithilfe von Synonymen zu beheben:

  1. Erstellen Sie ein Synonym für jedes der entfernten Objekte. Also statt prodserver2.mydatabase2.schema1.object1 Sie können mit dem Synonym darauf verweisen.
  2. Ändern Sie die Verweise auf jedes Objekt in sein Synonym.

Später erfahren Sie, wie Sie dies im Einzelnen tun.

Das Mitnehmen:

Synonyme bieten eine Abstraktionsebene, um Verweise auf Basisobjekte von jedem Teil Ihres Codes zu schützen, sei es innerhalb Ihrer Datenbank, Client-App oder an anderer Stelle. Sie können sich also freuen, wenn eine weitere Änderung eintritt, sei es eine Objektübertragung oder eine Umbenennung.

2. Sie können für die meisten Objekte SQL Server-Synonyme erstellen

Lassen Sie uns als Nächstes herausfinden, welche Objekte Synonyme haben können?

  • Tabellen
  • Aufrufe
  • Gespeicherte Prozeduren
  • Funktionen

Nachdem Sie nun die Objekttypen kennen, haben Sie vielleicht eine Vorstellung davon, was Sie mit Synonymen machen können. Lassen Sie uns genauer werden.

3. Sie können entsprechende Befehle für das Objektsynonym erteilen

Drittens sind hier einige spezifische Befehle für jeden Objekttyp.

Tabellen

Genauso wie Sie SELECT, INSERT, UPDATE und DELETE mit einer Tabelle machen können, können Sie dasselbe mit ihrem Synonym machen.

Also statt:

SELECT * FROM prodserver2.mydatabase2.schema1.table1

Sie können eine kürzere Version haben, die gegen die nächste Änderung resistent ist:

SELECT * FROM synonym1

Da dies der Fall ist, können Sie auch Folgendes tun:

UPDATE synonym1
SET column1 = <value>

Und dasselbe gilt für INSERT und DELETE.

Beachten Sie jedoch Folgendes:

  • Das Einfügen eines neuen Datensatzes durch ein Synonym fügt der Basistabelle einen neuen Datensatz hinzu. In unserem Fall prodserver2.mydatabase2.schema1.table1 .
  • Aktualisieren und Löschen haben denselben Effekt.

Bisher haben wir nur DML-Befehle gezeigt. Wie wäre es mit DDL-Befehlen wie DROP?

Leider können Sie sie nicht ausführen. Hier ist der Grund dafür:

Durch das Löschen eines Synonyms wird die Basistabelle nicht gelöscht. Das Synonym wird gelöscht. Darauf werde ich gleich näher eingehen.

Aber hier ist eine weitere Sache, die Sie mit SQL Server-Synonymen von Tabellen machen können:JOINs.

Wie bequem kann das sein? Statt dies auszugeben:

SELECT
 a.column1
,b.column1
FROM table3 a
INNER JOIN prodserver2.mydatabase2.schema1.table1 b on a.id = b.id

Sie können dies tun:

SELECT
 a.column1
,b.column1
FROM table3 a
INNER JOIN synonym1 b on a.id = b.id

Geht das einfacher? Alles klar!

Gespeicherte Prozeduren

Ein relevanter Befehl, den Sie mit einem Synonym einer gespeicherten Prozedur ausführen können, ist EXEC.

Anstatt also eine Remote-Prozedur wie diese aufzurufen:

EXEC prodserver2.mydatabase2.schema1.spProcedure1

Sie können ein Synonym für das obige Verfahren erstellen. Nennen wir es synProcedure1 . Und rufen Sie es so auf:

EXEC synProcedure1

Sollen wir weiter machen? Mit VIEWs und FUNCTIONs können Sie ähnlich vorgehen. Natürlich, wenn Sie die erforderlichen Berechtigungen haben. Aber lassen Sie uns zuerst besprechen, wie man SQL Server-Synonyme erstellt.

4. Sie können Ihre Suche nach SQL Server-Synonymen mit CREATE

beginnen

Wir haben den Punkt erreicht, an dem Sie Synonyme erstellen können. So können wir es mit T-SQL für eine Tabelle machen:

CREATE SYNONYM synonym1 FOR prodserver2.mydatabase2.schema1.table1

Aber beachten Sie diesen Vorbehalt:

Prüfung auf Existenz und Berechtigung für mydatabase2.schema1.table1 in prodserver2 wird bis zur Laufzeit verschoben.

Das bedeutet, dass Sie nicht wissen, ob:

  • die 2 Server (prodserver1 und prodserver2 ) sind bereits verlinkt.
  • die Datenbank mydatabase2 , das Schema schema1 , und die Tabelle table1 tatsächlich existieren.
  • Ihr Zugriff auf diese Ressourcen ist erlaubt.

Nachdem Sie das Synonym erstellt haben, testen Sie es also, indem Sie die Befehle ausführen, von denen Sie erwarten, dass sie funktionieren.

Und bei gespeicherten Prozeduren, Ansichten und Funktionen sollten Sie genauso vorgehen.

Aber das ist nicht alles. Wenn wir ein Synonym erstellen können, können wir es auch löschen mit:

DROP SYNONYM synonym1

Und hier ist noch ein Vorbehalt:Da Sie Synonyme jederzeit löschen können, werden Verweise auf gelöschte Synonyme nur zur Laufzeit überprüft.

Bevor Sie also ein Synonym löschen, überprüfen Sie sys.sql_modules falls es irgendwelche Hinweise darauf gibt.

Verwenden von SQL Server Management Studio (SSMS) zum Erstellen und Löschen von Synonymen

Bisher haben wir T-SQL verwendet, um SQL Server-Synonyme zu erstellen und zu löschen. Möglicherweise ziehen Sie es vor, eine grafische Benutzeroberfläche zu verwenden, wenn Sie dasselbe tun.

Lassen Sie uns den Ball ins Rollen bringen.

Synonyme erstellen

Wenn das Eintippen der Befehle nicht Ihr Ding ist, gehen Sie wie folgt vor, um Synonyme zu erstellen:

  1. Führen Sie SSMS aus und melden Sie sich bei Ihrem SQL Server an.
  2. Suchen Sie nach der Datenbank, in der Sie ein Synonym erstellen möchten.
  3. Erweitern.
  4. Klicken Sie mit der rechten Maustaste auf die Synonyme Ordner und wählen Sie Neues Synonym .
  5. Füllen Sie das Formular mit den für Synonyme erforderlichen Informationen aus, einschließlich Name, Schema usw.
  6. Klicken Sie auf OK .

Unten ist ein Screenshot des Formulars in SSMS:

Synonyme löschen

Apropos Präferenzen, das Eintippen der Befehle zum Erstellen von Synonymen ist mein Ding. Aber es ist einfacher, sie nach Belieben zu löschen, als die Befehle einzugeben. Das ist natürlich nur mein Geschmack. Wie dem auch sei, im Folgenden sind die Schritte aufgeführt, die beim Löschen eines Synonyms zu befolgen sind:

  1. Führen Sie SSMS aus und melden Sie sich bei Ihrem SQL Server an.
  2. Suchen Sie nach der Datenbank, in der sich das zu löschende Synonym befindet.
  3. Erweitern.
  4. Erweitern Sie die Synonyme Ordner.
  5. Suchen Sie nach dem Synonym, das Sie löschen möchten.
  6. Klicken Sie mit der rechten Maustaste auf das Synonym, das Sie löschen möchten, und wählen Sie Löschen aus .
  7. Klicken Sie auf OK .

Um die obigen Schritte zusammenzufassen, klicken Sie einfach mit der rechten Maustaste auf das Synonym, das Sie löschen möchten, und wählen Sie dann Löschen aus und klicken Sie abschließend auf OK .

Unten sehen Sie einen Screenshot des Fensters, das vor der Bestätigung des Löschvorgangs angezeigt wird:

5. Sie können SQL Server-Synonyme sichern

Mit GRANT, DENY oder REVOKE können Sie den Zugriff auf ein Synonym steuern.

Zum GEWÄHREN einer SELECT-Berechtigung für das Synonym synonym1 an einen Benutzer namens testuser , gehen Sie wie folgt vor:

GRANT SELECT ON synonym1 to testuser

Andere Berechtigungen, die Sie einem Synonym hinzufügen oder daraus entfernen können, sind die folgenden:

  • KONTROLLE
  • AUSFÜHREN
  • AKTUALISIEREN
  • EINFÜGEN
  • LÖSCHEN
  • DEFINITION ANZEIGEN
  • EIGENTUM ÜBERNEHMEN

6. Können Sie diese Tabelle, Ansicht oder Prozedur nicht finden? Es könnte ein Synonym sein

Eines der Probleme, auf die ein Neuling in Ihrem Team stoßen kann, ist eine „fehlende“ Tabelle, Ansicht, Prozedur oder Funktion. Wenn SELECT für ein Objekt ausgegeben wird, kann es natürlich eine Tabelle oder Ansicht sein. Aber er kann es nicht in der Tabellenliste oder der Ansichtsliste finden. Und wenn er zuvor keine SQL Server-Synonyme verwendet hat, ist das ein zusätzliches Problem.

Orientierungslosigkeit, eine Lücke in der Dokumentation oder eine Lücke in Ihren Standards können behoben werden. Hier ist ein raffiniertes Skript, das Ihnen hilft, Ihrem neuen Teammitglied die Liste der Synonyme und ihr Basisobjekt zu präsentieren:

SELECT
 a.[name]
,a.[base_object_name]
,OBJECTPROPERTYEX(OBJECT_ID(a.[name]), 'BaseType') as BaseType
,b.type_desc
FROM sys.synonyms a
INNER JOIN (SELECT DISTINCT type, type_desc from sys.all_objects) b on 
           CONVERT(varchar(2),OBJECTPROPERTYEX(OBJECT_ID(a.[name]), 'BaseType')) = b.type

Ein „fehlendes“ Objekt? Nicht mehr, wenn es ein Synonym ist.

Aber bevor Sie sich auf die Ausführung dieses Skripts freuen, sollten Sie noch einige weitere Dinge berücksichtigen:

  • sys.synonyme Hier sind alle SQL Server-Synonyme in der aktuellen Datenbank definiert.
  • Wir haben die Typen und Typbeschreibungen (type und type_desc bzw.) in sys.all_objects . Wenn Sie eine bessere Idee haben, als sie mit einer Unterabfrage zu verbinden, lassen Sie es mich bitte wissen.
  • OBJEKTEIGENSCHAFTEX wird verwendet, um den Typ des Basisobjekts abzurufen, wenn es sich um eine Tabelle, eine gespeicherte Prozedur oder etwas anderes handelt.
  • Zu guter Letzt, wenn Sie nicht die erforderliche Mindestberechtigung haben, um dieses Skript auszuführen und die gewünschte Ausgabe zu erhalten, ist es an der Zeit, sich mit Ihrem DBA oder jemandem mit einer ähnlichen Rolle anzufreunden:)

Aber Sie fragen sich vielleicht, warum all dies tun, wenn es nicht gut funktioniert?

7. Beeinflussen SQL Server-Synonyme die Leistung?

Dies ist ein allgemeines Anliegen. Und um zu verdeutlichen, was hinter den Kulissen vor sich geht, werfen wir einen Blick auf die Zusammenfassung dessen, was im Ausführungsplan passieren wird:

  1. Wenn der einfachste Code mit einem Synonym ausgeführt wird (z. B. SELECT * from synonym1), tritt SQL Server in eine Bindungsphase ein, in der das Basisobjekt das Synonym ersetzt.
  2. Als nächstes gilt, was auch immer der beste Optimierungsplan zum Ausführen eines Befehls für das Basisobjekt ist, er wird derselbe sein.

Hier sind einige Fragen und Antworten zu den beiden obigen Aussagen:

  1. Wie lange dauert die Bindungsphase von SQL Server? ANTWORT:Es dauert nicht lange. Es passiert normalerweise im Handumdrehen.
  2. Wenn der nächste Schritt denselben besten Optimierungsplan mit dem Basisobjekt verwendet und die Abfrage an das Basisobjekt „schnell genug“ ist, wird es dann langsamer sein? ANTWORT:Nein, da es denselben Ausführungsplan verwendet.
  3. Wie sieht es mit der Authentifizierung vom neuen Server aus? ANTWORT:Sollte es durch die Übertragung einer Datenbank auf einen neuen Server zu geringfügigen Verzögerungen kommen, sind diese nicht auf das Synonym zurückzuführen. Abfrageleistung beim Aufrufen unter Verwendung eines Synonyms oder Festcodierung des server.database.schema.object sollte gleich sein, da das Synonym nur ein alternativer Name für das Basisobjekt ist. Lösen Sie die langsame Leistung des Basisobjekts.

Aber nehmen Sie nicht mein Wort dafür. Sie sollten dies anhand Ihres Abfrageausführungsplans und der tatsächlichen Leistung überprüfen.

Schlussfolgerung

Alles in allem haben wir ziemlich viele Informationen zu SQL Server-Synonymen behandelt, also fassen wir noch einmal zusammen.

Erstens ist ein Synonym einfach ein alternativer Name, der Sie vor Änderungen und Übertragungen von Objektnamen bewahrt. Zweitens sind Tabellen, Ansichten, gespeicherte Prozeduren und Funktionen gute Kandidaten für Synonyme. Als Nächstes können Sie Befehle ausführen, die für das Basisobjekt eines Synonyms geeignet sind. Sie können es auch sichern. Wenn Sie dann die Liste der Synonyme sehen müssen, haben Sie sys.synonyms dir zu helfen. Schließlich sollte die Leistung kein großes Problem darstellen, wenn es keine Leistungsprobleme mit dem Basisobjekt gibt.

Warum probieren Sie es also nicht gleich heute aus?

Was denkst du? Lass es uns in den Kommentaren wissen.