當前位置:首頁 » 服務存儲 » 存儲過程怎麼觸發的
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

存儲過程怎麼觸發的

發布時間: 2022-07-17 15:54:34

❶ 如何在存儲過程中建立觸發器

(1).存儲過程:
create
procere
for_select(你想用的觸發器名字)
delare
@name
char(8)
output(用於輸出的),@age
int
output(用於輸出),@phone_num
char(11)
(輸入)
as
select
@name=name(列名),@age=age(列名)
from
table_name(表名)
where
phone_num(列名)=@phone_num
(2)觸發器
create
tigger
for_update
on
table_name
after
update
as
if(update(phone_num))
update
table_name2
set
phone_num=i.phone_num
from
deleted
d,inserted
i
where
table_name.phone_num=d.phone_num
end
其中:deleted與inserted是sql中默認的臨時表。用來儲存原來的值和插入的值。本觸發器的作用是
當更新table_name
中的phone_num時table_name1中的phone_num也一起更新!注意觸發器只能用於update.insert.delete.select中不能用於創建表............

❷ 存儲過程和觸發器

PROCEDURE
p_book1
PROCEDURE p_book2
書名='大學英語'
EXEC p_book2
圖書編號=@x
'001105'
varchar(20)
書籍表 where 書名=@c1
EXEC p_book4 '大學語文'

❸ 請問存儲過程與觸發器關系

存儲過程需要調用才執行裡面的sql語句。觸發器是設置好觸發條件,條件達到時自動運行裡面的sql語句,比如對a表進行更新(update)操作時,相應的觸發器就會運行。

❹ 如何用觸發器調用存儲過程!!

create trigger [owner.]trigger_name

on[owner.]table_name
{for insert}
as
sql_statement

順便問下:你的rollback怎麼寫在begin里了

❺ 如何利用存儲過程和觸發器來管理數據

一、SQL互動式資料庫查詢語言 互動式資料庫查詢語言SQL中有關表操作基本的SQL語句有如下四種:(下面分別出給四種語句的語法形式及其說明) (1)查詢表命令 SELECT[ALL|DISTINCT]select_list
[INTO[new_table_name]]
[FROM{table_name|view_name}
[WHERE clause]
[GROUP BY clause]
[HAVING clause]
[ORDER BY clause]
[COMPUTE clause] 4)刪除命令 DELETE[FROM]{table_name|view_name}
[WHERE clause] 其中: table_name|view_name指定源表名或源視圖名
WHERE clause給出修改條件 二、SQL Server中存儲過程和觸發器的使用 存儲過程是存儲在伺服器上的預先編譯好的SQL 語句在使用時要考慮以下問題: 1.存儲過程在第一次編譯時進行語法檢查,編譯好的存儲過程保存在高速緩存中用於調用,這樣執行的速度和效率較高。 2.存儲過程由應用程序激活,不由SQL Server自動執行。 3.一個存儲過程可以用於收集數據和修改數據,但是不能同時用於兩者。 存儲過程的優點是: 1.在執行重復任務時能提高效率; 2.使前端的應用程序共享應用邏輯; 3.可以永久創建,也可以臨時創建; 4.可以在SQL Server啟動時自動執行。 存儲過程的創建語句語法為: CREATE PROCere[owner.]procere_name[;number]
[(parameter1[,parameter2]...[parameter255])]
[{FOR REPLICATION}|{WITH RECOMPILE}
[{[WITH]|{,}ENCRYPTION]]
AS sql_statements 其中: procedre_name〓〓為過程名稱 ;number〓〓用於在過程名稱重復時進行編號 [(parameter1[,parameter2]...[parameter255])]〓〓為參數序列 WHTH RECOMPILE〓〓執行計劃不保存的高速緩存中,每次執行過程需要重新編譯 ENCRYPTION〓〓加密syscomments表的內容,syscomments表中包含CREATE PROCere的文本,保證無論何時都不刪除syscomments表 FOR REPLICATION〓〓過程在前台執行,不在伺服器上執行 下面的SQL語句在MYDATABASE資料庫上創建存儲過程my_store_pro1 USE MYDATABASE 以下須是一個獨立的查詢模塊,因為CREATE PROCDURE語句須是查詢模塊的首行。

❻ SQL里中存儲過程和觸發器,如何創建

(1).存儲過程:
create
procere
for_select(你想用的觸發器名字)
delare
@name
char(8)
output(用於輸出的),@age
int
output(用於輸出),@phone_num
char(11)
(輸入)
as
select
@name=name(列名),@age=age(列名)
from
table_name(表名)
where
phone_num(列名)=@phone_num
(2)觸發器
create
tigger
for_update
on
table_name
after
update
as
if(update(phone_num))
update
table_name2
set
phone_num=i.phone_num
from
deleted
d,inserted
i
where
table_name.phone_num=d.phone_num
end
其中:deleted與inserted是sql中默認的臨時表。用來儲存原來的值和插入的值。本觸發器的作用是
當更新table_name
中的phone_num時table_name1中的phone_num也一起更新!注意觸發器只能用於update.insert.delete.select中不能用於創建表............

❼ 如何在觸發器中調用存儲過程

在觸發器中調用存儲過程:

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

❽ 何為存儲過程,舉例說明觸發器的應用有哪些

存儲過程和觸發器,基本都是進行復雜數據操作的

區別是:
存儲過程:供用戶使用的
觸發器:DBMS使用的,不提供給用戶使用

觸發器主要用作數據完整\並列或者保護

如某倉庫的某數據
要求管理員在進行操作錄入數量的時候
能立即在B表的總庫存價值上也根據錄入的數量改變,而單個價值又在C表上
那麼在A表建立觸發器,當管理員在進行操作錄入數量的時候
進行和C表的計算,再將結果更新到B表
而以上全部是DBMS自動完成

管理員只需要錄入,什麼時候進的什麼貨,進了多少就行了
其他的觸發器解決了

❾ 存儲過程的觸發器

觸發器是一種特殊類型的存儲過程,它不同於我們前面介紹過的存儲過程。觸發器主要是通過事件進行觸發而被執行的,而存儲過程可以通過存儲過程名字而被直接調用。當對某一表進行諸如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