重編譯觸發器
根據資料庫新狀態的不同,資料庫中的某些更改可能導致執行計劃效率降低或無效。SQL Server 將檢測到使執行計劃無效的更改,並將計劃標記為無效。此後,必須為執行查詢的下一個連接重新編譯新的計劃。導致計劃無效的情況包括:
對查詢所引用的表或視圖進行更改(ALTER TABLE 和 ALTER VIEW)。
對執行計劃所使用的任何索引進行更改。
對執行計劃所使用的統計信息進行更新,這些更新可能是從語句(如 UPDATE STATISTICS)中顯式生成,也可能是自動生成的。
刪除執行計劃所使用的索引。
顯式調用 sp_recompile。
對鍵的大量更改(其他用戶對由查詢引用的表使用 INSERT 或 DELETE 語句所產生的修改)。
對於帶觸發器的表,插入的或刪除的表內的行數顯著增長。
使用 WITH RECOMPILE 選項執行存儲過程。
為了使語句正確,或要獲得可能更快的查詢執行計劃,大多數都需要進行重新編譯。
在 SQL Server 2000 中,只要批處理中的語句導致重新編譯,就會重新編譯整個批處理,無論此批處理是通過存儲過程、觸發器、即席批查詢,還是通過預定義的語句進行提交。在 SQL Server 2005 和更高版本中,只會重新編譯批處理中導致重新編譯的語句。由於這種差異,SQL Server 2000 和更高版本中的重新編譯計數不可比較。另外,由於 SQL Server 2005 和更高版本擴展了功能集,因此它們具有更多類型的重新編譯。
語句級重新編譯有助於提高性能,因為在大多數情況下,只有少數語句導致了重新編譯並造成相關損失(指 CPU 時間和鎖)。因此,避免了批處理中其他不必重新編譯的語句的這些損失。
SQL Server ProfilerSP:Recompile 跟蹤事件報告語句級重新編譯。此跟蹤事件在 SQL Server 2000 中僅報告批處理重新編譯。此外,將填充此事件的 TextData 列。因此,已不再需要 SQL Server 2000 中必須跟蹤 SP:StmtStarting 或 SP:StmtCompleted 以獲取導致重新編譯的 Transact-SQL 文本的做法。
跟蹤事件 SQL:StmtRecompile 報告語句級重新編譯。此跟蹤事件可用於跟蹤和調試重新編譯。SP:Recompile 僅針對存儲過程和觸發器生成,而SQL:StmtRecompile 則針對存儲過程、觸發器、即席批查詢、使用 sp_executesql 執行的批處理、已准備的查詢和動態 SQL 生成。
SP:Recompile 和 SQL:StmtRecompile 的 EventSubClass 列都包含一個整數代碼,用以指明重新編譯的原因。
2. oracle編譯觸發器時老轉圈
TRIGGER **** 編譯錯誤
錯誤:PLS-00103: 出現符號 "END"在需要下列之一時:
( begin case declare exit
for goto if loop mod null pragma raise return select update
while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge
行:8
文本:end****;
錯誤原因:
這種時候一般有兩種情況,分析如下:
1.掉了結束的符號(如:分號,if的結束end if;最有可能的還是分號),這種屬於比較好查的情況,仔細檢查即可發現問題。
2.存儲過程中可能出現全形的空格,這種錯是不可見的,存儲過程只接受半形的空格,這種錯誤屬於比較難查的,只能通過斷點或者將可能出錯的注釋點排除查錯。實在查不出來,最傻的辦法就是重新再手敲輸入一遍。
3.第三種情況一半是很容易忽略的的錯誤,觸發器創建之後必須輸入內容,不可為空,否則編譯報錯。例如:有的人新建了觸發器,後來發現觸發器不必要,但是又不想刪除,於是把內部代碼全部注釋再去編譯,然後就拋出異常的,一個沒有內容的觸發器是沒有存在的必要的,可以刪除或者禁用。
3. oracle 命令創建觸發器帶有編譯錯誤ora-06544:pl/sql:內部錯誤,怎麼解決
是用PL/SQL DEV進行編譯吧?
如果是,下列辦法應該可以解決:
1、打開工具-〉首選項
2、選擇調試器
3、將編譯時添加調試信息的選項不勾
4、確定後重新編譯