sql觸發器調用存儲過程
『壹』 關於sql觸發器調試問題
在sql中,觸發器是一種特殊類型的存儲過程,它不同於sql的存儲過程。觸發器主要是通過事件進行觸發而被執行的,而存儲過程可以通過存儲過程名字而被直接調用。當對某一表進行諸如update、
insert、
delete
這些操作時,sql
server
就會自動執行觸發器所定義的sql
語句,從而確保對數據的處理必須符合由這些sql
語句所定義的規則。
觸發器的主要作用就是其能夠實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據的一致性。除此之外,觸發器還有其它許多不同的功能:
(1)強化約束(enforce
restriction)
觸發器能夠實現比check
語句更為復雜的約束。
(2)跟蹤變化(auditing
changes)
觸發器可以偵測資料庫內的操作,從而不允許資料庫中未經許可的指定更新和變化。
(3)級聯運行(cascaded
operation)。
觸發器可以偵測資料庫內的操作,並自動地級聯影響整個資料庫的各項內容。例如,某個表上的觸發器中包含有對另外一個表的數據操作(如刪除,更新,插入)而該操作又導致該表上觸發器被觸發。
(4)存儲過程的調用(stored
procere
invocation)。
為了響應資料庫更新觸,發器可以調用一個或多個存儲過程,甚至可以通過外部過程的調用而在dbms(
資料庫管理系統)本身之外進行操作。
由此可見,觸發器可以解決高級形式的業務規則或復雜行為限制以及實現定製記錄等一些方面的問題。例如,觸發器能夠找出某一表在數據修改前後狀態發生的差異,並根據這種差異執行一定的處理。此外一個表的同一類型(insert、
update、
delete)的多個觸發器能夠對同一種數據操作採取多種不同的處理。
總體而言,觸發器性能通常比較低。當運行觸發器時,系統處理的大部分時間花費在參照其它表的這一處理上,因為這些表既不在內存中也不在資料庫設備上,而刪除表和插入表總是位於內存中。可見觸發器所參照的其它表的位置決定了操作要花費的時間長短。
觸發器的種類
sql
server
2000
支持兩種類型的觸發器:after
觸發器和instead
of
觸發器。其中after
觸發器即為sql
server
2000
版本以前所介紹的觸發器。該類型觸發器要求只有執行某一操作(insert
update
delete)
之後,觸發器才被觸發,且只能在表上定義。可以為針對表的同一操作定義多個觸發器。對於after
觸發器,可以定義哪一個觸發器被最先觸發,哪一個被最後觸發,通常使用系統過程sp_settriggerorder
來完成此任務。
instead
of
觸發器表示並不執行其所定義的操作(insert、
update、
delete),而僅是執行觸發器本身。既可在表上定義instead
of
觸發器,也可以在視圖上定義instead
of
觸發器,但對同一操作只能定義一個instead
of觸發器。
『貳』 SQL如何可以自動調用存儲過程
在觸發器裡面做唄
例如有一張表是用來計次的,計一次數,update一下對應欄位(如增加或減少)
你就在你的表上建立一個update的觸發器
調用這個存儲過程
不過得保證這個存儲過程執行速度和執行有效性
否則由於觸發器沒有執行完,這個表是鎖定的,既不能讀也不能寫
---------------------
你寫一個update觸發器在一個表上,每當這個表被update時候,就會運行這個觸發器腳本
『叄』 SQl中觸發器怎樣執行的
創建觸發器 是特殊的存儲過程,自動執行,一般不要有返回值。
1、後觸發器 (AFTER,FOR)先執行對應語句,後執行觸發器中的語句。
2、前觸發器 並沒有真正的執行觸發語句(insert,update,delete),而是執行觸發後的語句。
3、行級觸發器 (FOR EACH ROW) 在SQL server 中不存在。
(3)sql觸發器調用存儲過程擴展閱讀:
創建觸發的語法
CREATE TRIGGER trigger_name --觸發器名稱
ON table_name --觸發的表
[WITH ENCRYPTION]
FOR [DELETE, INSERT, UPDATE] --選擇觸發器類型
AS --觸發後要做的語句
T-SQL語句
GO --結束標記
『肆』 怎樣使用PLSQL Developer調試 存儲過程和觸發器
1. 打開PL/SQL Developer如果 在機器上安裝了PL/SQL Developer的話,打開PL/SQL Developer界面輸入 用戶名,密碼和host名字,這個跟在程序中web.config中配置的完全相同,點擊確定 找到 需要調試的存儲過程所在的包(Package bodies),如PACK_ACTIVITY,點擊右鍵,在彈出菜單中選擇[查看],得到包中的所有存儲過程和他們的代碼. 2. 添加debug信息為了 能夠單步跟蹤存儲過程,需要為其所在的包添加debug信息,右鍵點擊需要調試的包,在彈出菜單中選中[添加調試信息].這樣 就為包體添加了調試信息。 3. 調 試存儲過程現在 所有的准備工作都做好了,可以調試跟蹤存儲過程了。選擇 需要調試的存儲過程,點擊右鍵,在彈出菜單中 選擇[測試],進去測試窗口.測試窗口中有為了測試該存儲過程自動所產生的代碼,當然你也可以自己另外加入和修改代碼,對於我們目前只是為了調試存儲過程, 自動生成的代碼已經足夠了。接著按照如下的步驟進行調試。(1)添加存儲過程所需要的參數,我們項目中的大多數存儲過程都是需要參數 的,參數可以在測試窗口右下部分輸入。如:GetPanNO_New需要一個輸入參數v_employeeid,我們輸入180,輸出參數是mycursor,是查看結果的,不需要輸入任何值。 (2)開始調試,點擊[調試]菜單->[開始](或者按F9),就進去調試模式了,程序開始停在begin這一行. (3)以後的調試過程跟我們熟悉的的調試過程就一樣了:運行(Ctrl+R)單步 進入(Ctrl+N)單步 跳過(Ctrl+O)單步 退出(Ctrl+T)或者 點擊debug工具條上的按扭:當按Ctrl+N進去存儲過程的源代碼中後 在這 個窗口中可以查看過程中的變數值和堆棧。 (4)調試運行完了後,可以查看結果如下(點擊mycursor變數旁邊的按鈕). 4. Tip 令人 比較郁悶的是我們項目中很多的存儲過程都是一個SELECT語句,不管這個SELECT語句多麼復雜(SELECT語句中有嵌套的子SELECT語句),它也只能作為一行代碼,單步跟蹤就沒有什麼意義了。
『伍』 MSSQL 觸發器調用有返回值的存儲過程,測試沒有返回,不知道啥原因
你如何判斷沒有返回值?的執行存儲過程後,也沒有輸出
僅僅是在觸發器執行了個存儲過,既沒有輸出又不能用變數在外部接收
---------------------------------------------------------------
如果你要測試輸出,先要保證操作的內容會准確到達
我建議你最好在exec前後都加上print或者select輸出
『陸』 SQL 從觸發器獲得的值發送到存儲過程中獲取不到結果集
你可以在觸發器上調用存儲過程,
觸發器中有兩個臨時表inserted 和deleted ,這兩個表的表結構和創建觸發器的表是一樣的,
inserted表存的是當前插入或更新後的值,
deleted表存的是當前刪除或修改前的值.
你可以利用以上兩個臨時表的值來獲得你要的參數值,然後調用時傳入存儲過程
另外你也可以直接在觸發器中操作,不用存儲過程。
『柒』 sql中的觸發器與存儲過程有什麼相同點和不同點希望能專業點,謝謝
一、功能不同:
1、存儲過程的功能:
(1) 變數說明
(2) ANSI(美國國家標准化組織)兼容的SQL命令(如Select,Update….)
(3) 一般流程式控制制命令(if…else…、while….)
2、觸發器的功能:
(1)強化約束(Enforce
restriction)
(2)跟蹤變化Auditing
changes
(3)級聯運行(Cascaded
operation)
二、指代不同
存儲過程:在大型資料庫系統中,一組為了完成特定功能的SQL語句集。
觸發器:SQL server 提供給程序員和數據分析員來保證數據完整性的一種方法。
三、作用不同:
1、存儲過程:局時存儲過程,以兩個井字型大小(##)號開始,則該存儲過程將成為一個存儲在tempdb資料庫中的全局臨時存儲過程,全局臨時存儲過程一旦創建,以後連接到伺服器的任意用戶都可以執行它,而且不需要特定的許可權。
2、觸發器:可用於強制引用完整性,以便在多個表中添加、更新或刪除行時,保留在這些表之間所定義的關系。然而,強制引用完整性的最好方法是在相關表中定義主鍵和外鍵約束。
四、相同點:
觸發器是自動的:它們在對表的數據作了任何修改(比如手工輸入或者應用程序採取的操作)之後立即被激活。
觸發器可以通過資料庫中的相關表進行層疊更改。例如,可以在 titles 表的 title_id 列上寫入一個刪除觸發器,以使其它表中的各匹配行採取刪除操作。該觸發器用 title_id 列作為唯一鍵,在 titleauthor、sales 及 roysched 表中對各匹配行進行定位。
觸發器可以強制限制,這些限制比用 CHECK 約束所定義的更復雜。與 CHECK 約束不同的是,觸發器可以引用其它表中的列。
(7)sql觸發器調用存儲過程擴展閱讀:
觸發器可通過資料庫中的相關表實現級聯更改;通過級聯引用完整性約束可以更有效地執行這些更改。觸發器可以強制用比 CHECK 約束定義的約束更為復雜的約束。與CHECK約束不同,觸發器可以引用其它表中的列。例如,觸發器可以使用另一個表中的 SELECT 比較插入或更新的數據,以及執行其它操作,如修改數據或顯示用戶定義錯誤信息。
觸發器也可以評估數據修改前後的表狀態,並根據其差異採取對策。
『捌』 SQL SERVER能不能在觸發器里調用遠程伺服器的存儲過程,怎麼做。急!!,
windows 服務中 檢測MSDTC是否啟動
Distributed Transaction Coordinator