❶ 存儲過程的觸發器
觸發器是一種特殊類型的存儲過程,它不同於我們前面介紹過的存儲過程。觸發器主要是通過事件進行觸發而被執行的,而存儲過程可以通過存儲過程名字而被直接調用。當對某一表進行諸如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 觸發器。 Create procere procere_name
[@parameter data_type][output]
[with]{recompile|encryption}
as
sql_statement
解釋:
output:表示此參數是可傳回的
with {recompile|encryption}
recompile:表示每次執行此存儲過程時都重新編譯一次
encryption:所創建的存儲過程的內容會被加密
如:
表book的內容如下
編號 書名 價格
001 C語言入門 $30
002 PowerBuilder報表開發 $52
實例1:查詢表Book的內容的存儲過程
create proc query_book
as
select * from book
go
exec query_book
實例2:
加入一筆記錄到表book,並查詢此表中所有書籍的總金額 Createprocinsert_book@param1char(10),@param2varchar(20),@param3money,@---------加密asinsertintobook(編號,書名,價格)Values(@param1,@param2,@param3)select@param4=sum(價格)frombookgo執行例子:declare@total_pricemoneyexecinsert_book顛','Delphi控制項開發指南',$100,@total_priceoutputprint'總金額為'+convert(varchar,@total_price)go存儲過程的3種傳回值:
1)、以Return傳回整數
2)、以output格式傳回參數
3)、Recordset
傳回值的區別:
output和return都可在批次程式中用變數接收,而recordset則傳回到執行批次的客戶端中。
實例3:
設有兩個表為Proct,Order_,其表內容如下:
Proct
產品編號 產品名稱 客戶訂數
001 鋼筆 30
002 毛筆 50
003 鉛筆 100
Order_
產品編號 客戶名 客戶訂金
001 南山區 $30
002 羅湖區 $50
003 寶安區 $4
請實現按編號為連接條件,將兩個表連接成一個臨時表,該表只含編號.產品名.客戶名.訂金.總金額,
總金額=訂金*訂數,臨時表放在存儲過程中
代碼如下:
Create proc temp_sale
as
select a.產品編號,a.產品名稱,b.客戶名,b.客戶訂金,a.客戶訂數* b.客戶訂金 as總金額
into #temptable from Proct a inner join Order_ b on a.產品編號=b.產品編號-----此處要用別名
if @@error=0
print 'Good'
else
print 'Fail'
go
❷ 存儲過程的調用與觸發器的調用有何區別
存儲過程在你需要使用的時候自行調用,觸發器在發生某件事情的時候自動調用。如Insert觸發器,當表Insert數據的時候自動就執行了觸發器裡面的代碼
❸ oracle觸發器怎麼調用存儲過程,不用傳參數和傳參數都行
直接調用就可以了,但是存儲過程中不能有顯示的事務控制,例如commit;rollback;ddl。如果必須的,需要使用自治事務。使用自治事務時盡量避免對觸發器的宿主表進行操作,容易造成死鎖
❹ mysql!觸發器里如何調用存儲過程。
call showChildLst(new.pn,new.pa)
❺ 觸發器調存儲過程問題。求解。
我感覺可能跟系統的鎖機制有關,觸發器中插入數據,此時一般是需要鎖表的,如果默認是表級鎖,那麼在過程裡面select也是不行的。你可以修改一下過程,暫時不從"表a" select數據,換一個表,如果可以,那應該就是這個原因。如果select from其它表也不行,就是別的原因了。
❻ 如何用觸發器調用存儲過程!!
create trigger [owner.]trigger_name
on[owner.]table_name
{for insert}
as
sql_statement
順便問下:你的rollback怎麼寫在begin里了
❼ 您說:觸發器可以調用存儲過程. 觸發器中調用存儲過程會提高系統效率
我不知道你是在哪裡看到的這個邏輯,雖然存儲過程是經過預先編譯並存儲在資料庫中的,但一般來說,觸發器是種特殊的存儲過程,所以本質上並無誰快誰慢的問題,正如你說疑惑的,本身就屬於簡單業務邏輯的SQL是否還有必要通過觸發器再去調用一次存儲過程,帶來復雜開銷。
觸發器本身是在每一筆記錄產生變化的時候發生的,一般用於數據完整性的一些檢查,不建議寫太復雜的邏輯,或者是程序更新之前一種臨時性的解決方案,業務邏輯,還是建議以程序+存儲過程,當然這是站在系統建設的規劃、長期維護基礎上。
所以,如果僅僅是當時不方便更新程序,然後用觸發器來調用現有的邏輯,這個倒是一個不錯的臨時解決方案,畢竟系統的業務順暢第一位。
❽ 如何在觸發器中調用存儲過程
在觸發器中調用存儲過程:
CREATEtriggermalice
onBBSUser
forupdate
as
ifupdate(receive)--當receive欄位發生update事件時觸發
begin
updatebbsuser
setreceive_temp=bu.receive_temp+(i.receive-d.receive)
frombbsuserbu,deletedd,insertedi
wherebu.userid=i.userid
declare@tempfloat,@scopefloat
set@temp=(selectbb.receive_tempfrombbsuserbb,deleteddwherebb.userid=d.userid)
set@scope=(selectbb.receive_scopefromBBSUserbb,deleteddwherebb.userid=d.userid)
if@temp<=@scope
updateuserinfo
setstandnumber=bu.standnumber+(i.receive-d.receive)
fromuserinfobu,deletedd,insertedi
wherebu.userid=d.userid
declare@userint,@comfloat
select@user=d.userid,@com=us.standnumber
fromUserInfous,Deletedd,Insertedi
whereus.userid=d.userid
exectimely@user,@com
if@temp>@scope
begin
updateuserinfo
setstandnumber=bu.standnumber+(@scope-d.receive)
fromuserinfobu,deletedd,insertedi
wherebu.userid=d.userid
updatebbsuser
setreceive_temp=@scope
frombbsuserbu,deletedd
wherebu.userid=d.userid
select@user=d.userid,@com=us.standnumber
fromUserInfous,Deletedd,Insertedi
whereus.userid=d.userid
exectimely@user,@com
end
end
❾ Oracle 觸發器調用存儲過程
通過配置本地資料庫的tns配置文件實現:
去oracle安裝目錄下oracle\proct\10.2.0\db_2\NETWORK\ADMIN\ 找到tnsnames.ora,用記事本打開,里邊有遠程資料庫的tns連接配置串如下
ORCL23 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.23)(PORT = 1521))
)
(CONNECT_DATA =
(SID = ORCL)
)
)
添加好ip、埠和目標資料庫的實例名(SID),然後確保tns名稱(ORCL23)在整個文檔中唯一,保存後打開資料庫連接工具,輸入遠程資料庫上的用戶名密碼,選擇資料庫對象為你配置的連接名就可以了
❿ 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 約束不同的是,觸發器可以引用其它表中的列。
(10)用觸發器調用存儲過程擴展閱讀:
觸發器可通過資料庫中的相關表實現級聯更改;通過級聯引用完整性約束可以更有效地執行這些更改。觸發器可以強制用比 CHECK 約束定義的約束更為復雜的約束。與CHECK約束不同,觸發器可以引用其它表中的列。例如,觸發器可以使用另一個表中的 SELECT 比較插入或更新的數據,以及執行其它操作,如修改數據或顯示用戶定義錯誤信息。
觸發器也可以評估數據修改前後的表狀態,並根據其差異採取對策。