it-swarm.com.de

Deaktivieren der Überprüfung des Schemas bei der Erstellung von Funktionen / gespeicherten Prozeduren

Ich versuche, den Prozess zu automatisieren, der Änderungen an der SQL Server 2008 R2-Datenbank ausführt. Der von mir eingerichtete Prozess löscht und erstellt meine gespeicherten Prozeduren und Funktionen neu und führt Skripte aus, um die Tabellen/Spalten/Daten zu ändern. Leider erfordert eines der Skripte, dass eine der Funktionen zuerst eingerichtet wird. Ich kann jedoch nicht alle gespeicherten Prozess-/Funktionsänderungen zuerst ausführen, da Spalten zuerst aus den Skripten für Tabellen/Spalten/Datenänderungen hinzugefügt werden.

Ich habe mich gefragt, ob es möglich ist, gespeicherte Prozeduren und Funktionen auszuführen, ohne dass SQL Server die in der Definition der Funktion/SP verwendeten Spalten überprüft. Ich habe versucht zu suchen, konnte aber keine Bedingung oder keinen Befehl finden, um dies zu aktivieren.

18
Brian Mains

Sie können gespeicherte Prozeduren erstellen, die auf Objekte verweisen, die noch nicht vorhanden sind (z. B. Tabellen und Funktionen). Sie können keine gespeicherten Prozeduren erstellen, die auf noch nicht vorhandene Spalten in bereits vorhandenen Objekten verweisen. Dies ist das zweischneidige Schwert der verzögerten Namensauflösung - SQL Server bietet Ihnen in einigen Fällen den Vorteil des Zweifels, aber nicht in allen. Siehe Erlands Ideen für SET STRICT_CHECKS ON; um einige Vorstellungen von den Orten zu bekommen, an denen dies funktioniert und von denen es bricht:

http://www.sommarskog.se/strict_checks.html

(Und wie er das genaue Gegenteil von dem haben möchte, wonach Sie suchen - Sie möchten zulassen, dass alles unabhängig von seiner Existenz kompiliert wird, und er möchte, dass jede einzelne Spalte oder Tabelle überprüft wird.)

Es gibt keine Einstellung wie SET DEFERRED_NAME_RESOLUTION OFF; obwohl gefragt wurde:

http://connect.Microsoft.com/sql/127152

Und es gibt keine Einstellung wie IGNORE ALL_RESOLUTION;.


Sie können dies auf verschiedene Arten umgehen, einschließlich:

(a) Verwenden Sie dynamisches SQL in den betroffenen gespeicherten Prozeduren.

(b) baue einen Stub für CREATE PROCEDURE mit nichts darin, dann führen Sie den Rest Ihres Skripts aus, und führen Sie dann ein ALTER PROCEDURE, das den realen Körper hat (im Wesentlichen die Prozedur in zwei Phasen bereitstellen).

(c) Machen Sie Ihr Bereitstellungstool in Bezug auf die Reihenfolge der Vorgänge intelligenter. Wenn für Tabellenänderungen das Vorhandensein einer Funktion erforderlich ist, schreiben Sie diese Änderungen zuletzt per Skript. Schema-Vergleichstools wie RedGates SQL Compare sind ziemlich gut darin, Skripte in der richtigen Abhängigkeitsreihenfolge für Sie zu generieren. Sie erwähnen nicht, welches Tool Sie verwenden, aber wenn dies nicht der Fall ist ...

(d) Martin Smith hat hier eine interessante Problemumgehung , aber ich habe nicht damit gespielt.

21
Aaron Bertrand

Sie können eine gespeicherte Prozedur erstellen, die das betreffende Objekt zuerst löscht oder umbenennt und dann Ihre ursprüngliche gespeicherte Prozedur als dynamisches SQL ausführt. Auf diese Weise müssen Sie die tatsächlich gespeicherte Prozedur nicht neu schreiben, um dynamisches SQL zu verwenden.

Der folgende Code führt eine gespeicherte Prozedur aus, die auf noch nicht vorhandene Spalten verweist (Expense_Super_Compare).

IF OBJECT_ID('Expense_Super_Compare_Results', 'U') IS NOT NULL
BEGIN
     EXEC('DROP TABLE Expense_Super_Compare_Results');
END

exec('exec dbo.Expense_Super_Compare');
1
Lou Fancy