Sql-Server

在函式/儲存過程創建時禁用模式檢查

  • January 17, 2019

我正在嘗試自動化執行對 SQL Server 2008 R2 數據庫的更改的過程。我實施的過程刪除並重新創建了我的儲存過程和函式,並執行腳本來更改表/列/數據。不幸的是,其中一個腳本需要首先實施其中一個功能。但是我不能首先執行所有儲存的過程/函式更改,因為它依賴於首先從表/列/數據更改腳本中添加的列。

我想知道是否可以在沒有 SQL Server 驗證函式/SP 定義中使用的列的情況下執行儲存過程和函式?我嘗試查找但找不到啟用此功能的條件或命令。

您可以創建引用尚不存在的*對象(例如表和函式)的儲存過程。*您不能創建引用在已存在的對像中尚不存在的列的儲存過程。這是延遲名稱解析的雙刃劍——SQL Server 在某些情況下為您提供了懷疑的好處,但不是全部。請參閱 Erland 的想法,SET STRICT_CHECKS ON;以了解有關此工作的地方和中斷的地方的一些想法:

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

(以及他希望與您所追求的截然相反的方式-您希望無論是否存在都可以編譯任何內容,並且他希望檢查每個列或表。)

沒有像SET DEFERRED_NAME_RESOLUTION OFF;它被要求的設置:

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

並且沒有像IGNORE ALL_RESOLUTION;.


您可以通過幾種方式解決此問題,包括:

(a) 在受影響的儲存過程中使用動態 SQL。

(b)建構一個CREATE PROCEDURE沒有任何內容的存根,然後執行腳本的其餘部分,然後執行ALTER PROCEDURE具有真實主體的一個(實質上,分兩個階段部署該過程)。

(c) 使您的部署工具對操作順序更加智能。如果表更改需要存在函式,則最後編寫這些更改。RedGate 的 SQL Compare 等模式比較工具非常適合以正確的依賴順序為您生成腳本。你沒有提到你正在使用什麼工具,但如果它沒有這樣做……

(d) Martin Smith 在這裡有一個有趣的解決方法,但我沒有玩過。

引用自:https://dba.stackexchange.com/questions/24806