Disabilitazione del controllo dello schema sulla creazione della funzione / stored procedure


17

Sto cercando di automatizzare il processo che esegue le modifiche al database SQL Server 2008 R2. Il processo che ho messo in atto elimina e ricrea le mie procedure e funzioni memorizzate, oltre a eseguire script per modificare tabelle / colonne / dati. Sfortunatamente, uno degli script richiede che una delle funzioni sia prima attiva. Ma non posso eseguire prima tutte le modifiche memorizzate proc / function perché si basa innanzitutto sull'aggiunta di colonne dagli script di modifica tabelle / colonne / dati.

Mi chiedevo se fosse possibile eseguire stored procedure e funzioni senza che SQL Server convalidasse le colonne utilizzate nella definizione della funzione / SP? Ho provato a cercare ma non sono riuscito a trovare una condizione o un comando per abilitare questo.


Sembra che tu debba semplicemente riorganizzare la creazione dell'oggetto nei tuoi script.
Thomas Stringer,

@shark È che uno script di modifica richiede una dipendenza da una funzione presente, cosa che al momento non era ... fare ciò richiederebbe un intervento manuale; Volevo qualcosa di più automatico.
Brian Mains,

Risposte:


20

È possibile creare procedure memorizzate che fanno riferimento a oggetti che non esistono ancora (ad esempio tabelle e funzioni). Non è possibile creare procedure memorizzate che fanno riferimento a colonne che non esistono ancora in oggetti che già esistono. Questa è la spada a doppio taglio della risoluzione differita dei nomi: in alcuni casi SQL Server offre il vantaggio del dubbio, ma non tutti. Guarda le idee di Erland per SET STRICT_CHECKS ON;ottenere alcune idee sui luoghi in cui funziona e sui luoghi in cui si rompe:

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

(E come vorrebbe l'opposto polare di ciò che stai cercando: vuoi consentire a qualsiasi cosa di essere compilata indipendentemente dall'esistenza, e vuole che ogni singola colonna o tabella venga controllata.)

Non è possibile impostare come SET DEFERRED_NAME_RESOLUTION OFF;se fosse stato richiesto:

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

E non c'è impostazione come IGNORE ALL_RESOLUTION;.


Puoi aggirare il problema in diversi modi, tra cui:

(a) utilizzare SQL dinamico nelle stored procedure interessate.

(b) crea uno stub per CREATE PROCEDUREcui non contiene nulla, quindi esegui il resto dello script, quindi esegui unALTER PROCEDURE contiene che ha il corpo reale (in sostanza, distribuisci la procedura in due fasi).

(c) rendere lo strumento di implementazione più intelligente sull'ordine delle operazioni. Se le modifiche alla tabella richiedono la presenza di una funzione, eseguire lo script delle ultime modifiche. Gli strumenti di confronto degli schemi come Red Compare di SQL di RedGate sono piuttosto efficaci nel generare script per te nel giusto ordine di dipendenza. Non dici quale strumento stai usando, ma se non lo fa ...

(d) Martin Smith ha una soluzione interessante qui , ma non ci ho giocato.


Caspita, quell'hack di Martin Smith è genialmente intelligente. Mi sentirei sporco usandolo ora, ma nei miei primi 20 anni avrei.
John Zabroski,

1

È possibile creare una procedura memorizzata che elimina o rinomina prima l'oggetto in questione, quindi esegue la procedura memorizzata originale come SQL dinamico. In questo modo non è necessario riscrivere l'effettiva procedura memorizzata per utilizzare SQL dinamico.

Il codice seguente esegue una procedura memorizzata che fa riferimento a colonne che non esistono ancora (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');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.