it-swarm-eu.dev

Zakázání kontroly schématu při vytváření funkce / ukládání uložené procedury

Snažím se automatizovat proces, který provádí změny v databázi SQL Server 2008 R2. Proces, který jsem zavedl, klesá a znovu vytváří uložené procedury a funkce a také spouští skripty pro změnu tabulek/sloupců/dat. Bohužel, jeden ze skriptů vyžaduje, aby jedna z funkcí byla zavedena jako první. Ale nemohu spouštět všechny uložené změny proc/funkce jako první, protože se spoléhá na přidání sloupců ze skriptů pro změny tabulek/sloupců/dat.

Zajímalo by mě, zda je možné spustit uložené procedury a funkce bez toho, aby SQL Server ověřoval sloupce použité v definici funkce/SP? Snažil jsem se hledat, ale nemohl jsem najít podmínku nebo příkaz, který by to umožnil.

18
Brian Mains

Můžete vytvořit uložené procedury odkazující na objekty , které dosud neexistují (např. Tabulky a funkce). Nemůžete vytvořit uložené procedury odkazující na sloupce, které dosud neexistují v objektech, které již existují. Toto je dvojsečný meč s odloženým rozlišením názvů - SQL Server vám dává výhodu pochybnosti v některých případech, ale ne ve všech. Viz Erlandovy nápady pro SET STRICT_CHECKS ON; získat několik představ o místech, kde tato práce funguje, a místech, která se rozbijí:

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

(A jak by si přál polární opak toho, po čem jste - chcete nechat cokoli zkompilovat bez ohledu na existenci a chce, aby byl zkontrolován každý sloupec nebo stůl.)

Neexistuje žádné nastavení jako SET DEFERRED_NAME_RESOLUTION OFF; ačkoli to bylo požadováno:

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

A neexistuje žádné nastavení jako IGNORE ALL_RESOLUTION;.


Dalo by se to obejít několika způsoby, včetně:

a) používat dynamické SQL v dotčených uložených procedurách.

(b) sestavit výhonek pro CREATE PROCEDURE s ničím v tom, pak spusťte zbytek skriptu a potom spusťte ALTER PROCEDURE, který má skutečné tělo (v podstatě nasaďte postup ve dvou fázích).

(c) aby byl váš nasazovací nástroj chytřejší o pořadí operací. Pokud změny tabulky vyžadují přítomnost funkce, skript tyto změny vydrží. Nástroje pro porovnání schémat, jako je RedGate's SQL Compare, jsou docela dobré ohledně vytváření skriptů pro vás ve správném pořadí závislostí. Nezmíníte, jaký nástroj používáte, ale pokud to nedělá ...

(d) Martin Smith má zde zajímavé řešení , ale nehrál jsem si s tím.

21
Aaron Bertrand

Můžete vytvořit uloženou proceduru, která nejprve odstraní nebo přejmenuje dotyčný objekt a poté spustí původní uloženou proceduru jako dynamický SQL. Tímto způsobem nemusíte přepisovat skutečnou uloženou proceduru, abyste mohli používat dynamický SQL.

Následující kód spustí uloženou proceduru odkazující na sloupce, které ještě neexistují (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