線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1024
推到 Plurk!
推到 Facebook!

TRIGGER 初探

尚未結案
will
中階會員


發表:176
回覆:135
積分:62
註冊:2002-04-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-28 16:38:42 IP:218.162.xxx.xxx 未訂閱
小弟想利用Trigger , 當使用者異動到FieldA時, 自動去更改FieldB 現在舉一個簡單的例子 CREATE TRIGGER [TestTrigger] ON [dbo].[MyTable] FOR INSERT, UPDATE AS IF UPDATE(FieldA) SET FieldB=FieldA*1.05 GO 但是檢查語法時SQL Server 2000 老是說我=附近語法不對 找了書上的範例 好像這樣寫沒有錯 可否請線上的高手指點迷津
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-28 17:31:22 IP:163.26.xxx.xxx 未訂閱
WILL您好..請參考一下文章 >
will
中階會員


發表:176
回覆:135
積分:62
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-28 20:17:33 IP:218.162.xxx.xxx 未訂閱
我將Trigger的程式稍做修改 但還是出現=附近語法不定確的訊息    CREATE TRIGGER [TestTrigger] ON [dbo].[MyTable]  FOR INSERT, UPDATE  AS BEGIN   IF UPDATE(FieldA)   SET FieldB=FieldA*1.05 END    
引言: WILL您好..請參考一下文章 > < face="Verdana, Arial, Helvetica">
James
高階會員


發表:10
回覆:290
積分:220
註冊:2002-07-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-28 21:40:00 IP:220.140.xxx.xxx 未訂閱
如果你只是想要完成您的需求 ,或許不必使用到 Trigger , 您可以採用 View or Computed column 來處理 EX1 : create view TestView as select MyTable.*, FieldA*1.05 as FieldB from MyTable EX2 : CREATE TABLE MyTable ( FieldA int, FieldB AS FieldA*1.05 )
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-28 21:47:54 IP:61.62.xxx.xxx 未訂閱
hi, 因為你的異動對象是有問題的, 試試這樣:    
CREATE TRIGGER [TestTrigger] ON [dbo].[MyTable] 
FOR INSERT, UPDATE 
AS
BEGIN
  IF UPDATE(FieldA)
  SET FieldB=FieldA*1.05
  update inserted set fieldb=fielda * 1.05
END
will
中階會員


發表:176
回覆:135
積分:62
註冊:2002-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-03-29 05:33:39 IP:218.162.xxx.xxx 未訂閱
Thanks 但還是語法檢查還是有錯誤訊息 :邏輯資料表inserted 和Deleted 無法更新    
引言: hi, 因為你的異動對象是有問題的, 試試這樣:
CREATE TRIGGER [TestTrigger] ON [dbo].[MyTable] 
FOR INSERT, UPDATE 
AS
BEGIN
  IF UPDATE(FieldA)
  SET FieldB=FieldA*1.05
  update inserted set fieldb=fielda * 1.05
END
will
中階會員


發表:176
回覆:135
積分:62
註冊:2002-04-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-03-29 05:54:18 IP:218.162.xxx.xxx 未訂閱
謝謝您的指導 小弟是想舉個簡單的例子做為學習trigger的入門 但一開始就有問題 還請您繼續指教    
引言: 如果你只是想要完成您的需求 ,或許不必使用到 Trigger , 您可以採用 View or Computed column 來處理 EX1 : create view TestView as select MyTable.*, FieldA*1.05 as FieldB from MyTable EX2 : CREATE TABLE MyTable ( FieldA int, FieldB AS FieldA*1.05 )
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-03-29 09:23:22 IP:203.95.xxx.xxx 未訂閱
sorry, 基本上 inserted 及 deleted 是不能異動的, 弟昨天 post 沒有注意到, 可以改為直接異動你正在更新的 table 即可, 修正如下:
CREATE TRIGGER [TestTrigger] ON [dbo].[MyTable] 
FOR INSERT, UPDATE 
AS
BEGIN
  IF UPDATE(FieldA)
  SET FieldB=FieldA*1.05
  update inserted set fieldb=fielda * 1.05
  update MyTable set fieldb=fielda * 1.05 where primary_key in (select primary_key from inserted )
END
其中 primary_key 是一該 table 的主鍵值, 用此作為關連來進行原始table (MyTable)和 inserted table 的比對後作為異動條件即可!
will
中階會員


發表:176
回覆:135
積分:62
註冊:2002-04-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-03-29 09:56:49 IP:61.221.xxx.xxx 未訂閱
經由您的解答 小弟的第一個trigger已經可以跑了    再請教一個問題 如果primary key 是由兩個欄位所組成的, 要如何處理呢?    
引言: sorry, 基本上 inserted 及 deleted 是不能異動的, 弟昨天 post 沒有注意到, 可以改為直接異動你正在更新的 table 即可, 修正如下:
CREATE TRIGGER [TestTrigger] ON [dbo].[MyTable] 
FOR INSERT, UPDATE 
AS
BEGIN
  IF UPDATE(FieldA)
  SET FieldB=FieldA*1.05
  update inserted set fieldb=fielda * 1.05
  update MyTable set fieldb=fielda * 1.05 where primary_key in (select primary_key from inserted )
END
其中 primary_key 是一該 table 的主鍵值, 用此作為關連來進行原始table (MyTable)和 inserted table 的比對後作為異動條件即可!
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-03-29 20:35:20 IP:61.62.xxx.xxx 未訂閱
一樣地, 使用複合關連的查詢即可, 如:    
CREATE TRIGGER [TestTrigger] ON [dbo].[MyTable] 
FOR INSERT, UPDATE 
AS
BEGIN
  IF UPDATE(FieldA)
  update MyTable set fieldb=b.fielda * 1.05 from MyTable a inner join inserted b 
  on a.p1=b.p1 and a.p2=b.p2 
END    
系統時間:2024-09-09 12:28:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!