2012-12-20 4 views
5

Wir in alle unsere Datenbank überprüfen Objekte in die Quellcodeverwaltung als rerunnable Skripte (Ansichten, Funktionen, Trigger & gespeicherte Prozeduren etc ...)Was sind die Nachteile beim Erstellen von gespeicherten SQL Server-Prozeduren auf die folgende Weise?

Wenn es darum geht, Zeit zu implementieren, müssen wir sicherstellen, dass alle Skripte sind re -runable & wiederholbar, damit eine gespeicherte Prozedur auf die neueste Version erstellt/aktualisiert wird.

Gibt es Nachteile beim Erstellen der Skripts auf folgende Weise.

IF NOT EXISTS 
(
    SELECT  * 
    FROM  INFORMATION_SCHEMA.ROUTINES 
    WHERE  ROUTINE_SCHEMA = 'dbo' 
    AND   ROUTINE_NAME = 'MyStoredProcedure' 
) 
BEGIN 
    EXEC ('CREATE PROCEDURE [dbo].[MyStoredProcedure] AS SELECT 1') 
    -- ALSO DO ANY INITIAL GRANT PRIVILEGE SCRIPTING HERE 
END 
GO 
ALTER PROCEDURE [dbo].[MyStoredProcedure] (
    @param1 INT, 
    @param2 NVARCHAR(50) = 'Default String' 
) 
AS 
BEGIN 
    -- DO SOMETHING WITH @param1 AND @param2 
    SELECT 1; 
END 
GO 

Im Wesentlichen überprüft das Skript, um zu sehen, ob das Objekt in der jeweiligen Systemansicht vorhanden ist, und wenn es einige dynamischen SQL erstellt nicht vorhanden ist, es als Stub in bedingten erlaubt zu umgehen CREATE PROCEDURE/GO Aussage Probleme nicht werden Blöcke. Dann wendet es die tatsächliche Funktionalität des Skripts über eine ALTER an.

So sind die Vorteile für mich offensichtlich, ich frage mich nur, gibt es irgendwelche Nachteile, dies zu tun ... abgesehen von dem kleinen Overhead des Schreibens etwas mehr ausführliche Skripte.

+0

Sie werden wahrscheinlich einige nahe/subjektive Stimmen bekommen, basierend darauf, wie Sie das formuliert haben, und das ist vielleicht besser für DBA geeignet, aber ich finde das eine interessante Lösung für ein Problem, das wir bei einem früheren Unternehmen hatten. – Joe

+0

Nun, ich denke, ich suche nach legitimen technischen "Schattenseiten" ..., d. H. Gibt es irgendwelche technischen Gründe für 'DROP/CREATE' anstatt für' ALTERING'? Könnten 'ALTERS' irgendwelche Auswirkungen auf Ausführungspläne usw. haben ... –

+4

Es ist eine Schande, dass der SQL Server fast zwei Jahrzehnte alt ist und immer noch nicht dazu gekommen ist, einen Befehl 'ERSTELLEN ODER ERSETZEN' zu implementieren. – SWeko

Antwort

2

10 Jahre SQL Server Entwickler/Architekt hier, und ich kann mir keine Nachteile vorstellen, außer den (relativ geringen) Vorkosten für die Erstellung des Skripts, das dies tun wird. Wenn Sie Bedenken haben, dass ein Plan, der zum Zeitpunkt der Erstellung als trivial kompiliert wurde, nicht neu kompiliert wird, wenn die Prozedur ALTERED ist, könnten Sie für jeden einen expliziten Aufruf von SP_RECOMPILE hinzufügen, aber ich hatte dieses Problem mit SQL Server nie (Ich hatte es mit DB2), und ich denke, das ist übermäßige Vorsicht.

Dies ist eine interessante und ich denke nützliche Ansatz.

+1

SQL Server kompiliert keinen Plan zum Zeitpunkt der SP-Erstellung. Es wird zur Erstellungszeit geparst, aber bei der ersten Ausführung kompiliert, und die Ausführung von 'ALTER PROC' würde sowieso alle zwischengespeicherten Pläne ungültig machen. –

+0

Sie haben natürlich Recht. :) Ich hätte wahrscheinlich nicht "zur Zeit der Schöpfung" sagen sollen. Ich bin darauf gestoßen, wenn Anwendungsframeworks gespeicherte Prozeduren ausführen, wenn sie kompilieren und verknüpfen, und nur mit DB2. Wie gesagt, ich denke, das ist eine übertriebene Vorsicht - es ist wirklich der einzige Einwand oder Vorbehalt, den ich mir einfallen lassen könnte. – DeanGC

+0

Danke für die Rückmeldung Dean & Martin. ~ EoinC –

Verwandte Themen