全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1853
推到 Plurk!
推到 Facebook!

SQL2000 trigger運用

答題得分者是:silence
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-03 22:17:53 IP:61.66.xxx.xxx 未訂閱
sorry! 版主    這個問題與delphi並無太大關係, 只是不知道該放那問, 只好請版主通融一下 SQL 2000 Trigger 問題站上也問了不少, 我搜尋過但沒有我要的答案, 所以 在這裡向各位有經驗的前輩再次請教!    我的需要, 寫一個trigger , 功能在 由遠端客戶登入SQL server,  after insert, update 送回一筆記錄post之後, 我要把其中幾個欄位 清掉(原由解釋說來話長, 目的就是要完成清除欄位), 資料庫一共有2000萬筆,  我寫了一個trigger在該Table中, 但第一個客戶登入送回post之後, 系統就鎖 死了(客戶端在執行adoquery.post之後電腦就被wait住, 而server端也動不了), 最後整個mdf掛點完全毀損, 不管用備份, 卸載, 匯出, sql都說 mdf檔有問題 trigger 如下    
CREATE TRIGGER tr_FieldUpdate ON [dbo].[Customer]
AFTER INSERT, UPDATE
AS
UPDATE Customer
SET USERNAME= '',
    USERPASS= '',
    USERKEY= '',
    USERSHORT= ''
足足花了我6個小時才把前一天的備份給還原回來, 後來我發現可能我沒 有加where才導致一筆進來, 系統做2000萬筆, 結果我在 底下又加上 SET ... where @USERID 但Trigger 似乎不接受這樣的做法, 告知 @USERID必須宣告, 可是Trigger 又不像StoreProcedure 可以宣告 @USERID varchar(10) 不知各位對上面的寫法是否有何可建議的, 謝謝!
James
高階會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-04 01:02:07 IP:218.162.xxx.xxx 未訂閱
1. 您這個 Trigger 的寫法似乎有問題, 因為當你 Update 一筆時 ,他會把 全部的資料那幾個欄位都清空耶...那當然慢囉 2. 如果是三層架構可以從 ProviderFlag 去處理 3. 如果真的想用 Trigger 去檔 , 試試看 Trigger 中的 Inserted 的 Table, 那個 Table 會記錄變動資料 , 用那個和原本的資料去做 Join 就可以找到 你真正想要 Update 的資料
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-04 01:29:24 IP:61.66.xxx.xxx 未訂閱
引言: 1. 您這個 Trigger 的寫法似乎有問題, 因為當你 Update 一筆時 ,他會把 全部的資料那幾個欄位都清空耶...那當然慢囉 2. 如果是三層架構可以從 ProviderFlag 去處理 3. 如果真的想用 Trigger 去檔 , 試試看 Trigger 中的 Inserted 的 Table, 那個 Table 會記錄變動資料 , 用那個和原本的資料去做 Join 就可以找到 你真正想要 Update 的資料
我知道是全部資料都被update, 因為資料庫毀掉了, 但有沒有更簡單的方式 例如updatesql一樣, 可以取得本筆的USERID, 然後UPDATE, 因為Trigger這 部份我不是很清楚, 看了幾個T-SQL書似乎沒有可適用的例子, 謝謝!
arvinhsu
一般會員


發表:0
回覆:10
積分:7
註冊:2003-04-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-04 17:20:49 IP:211.76.xxx.xxx 未訂閱
在這先擬清幾個問題: 1. Trigger是可以宣告變數的語法如下: DECLARE @USERID varchar(10) 2. 你是想在什麼時候去做這個Trigger的處理,是要在insert、update 、Delte 還是全部都有(這會關係到你要怎麼去取得資料的問題)
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-04 19:25:20 IP:61.66.xxx.xxx 未訂閱
引言: 在這先擬清幾個問題: 1. Trigger是可以宣告變數的語法如下: DECLARE @USERID varchar(10) 2. 你是想在什麼時候去做這個Trigger的處理,是要在insert、update 、Delte 還是全部都有(這會關係到你要怎麼去取得資料的問題)
1.我有嘗試 declcar 的宣告方式(放在 create tirgger下面), 但語法不通過 2.我希望在對方執行 adoquery.insert, adoquery.edit(我是用ado連接), 然後 下了 adoquery.post 行為, 透過 ado 送回主機端時執行這段清除動作 謝謝!
silence
一般會員


發表:9
回覆:17
積分:10
註冊:2003-06-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-04 19:33:04 IP:61.218.xxx.xxx 未訂閱
0. DECLARE @myUser AS nvarchar(256) SET @myUser = USER 可以取得 username 1. 先不管能不能抓到 DB Server 的 USERID 先想一下, 你抓 DB Server 的 USERID 有效嗎? USERID 用的是 Login DB 的 username, 不會是你的資料庫中的人員資料吧 ==> 推測, 不然你的 server login ID 也要有 2000萬個嗎?? 你的遠端程式 login ID 應該都是用同一個吧, 應該也不是用 NT 帳號那種 2. 所以問題應該沒有那麼複雜 只要從 Inserted / Deleted table 就行了 CREATE TRIGGER tr_FieldUpdate ON [dbo].[Customer] AFTER INSERT, UPDATE AS UPDATE Customer SET USERNAME= '', USERPASS= '', USERKEY= '', USERSHORT= '' WHERE USERNAME IN (SELECT Ins.USERNAME FROM INSERTED Ins)
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-04 22:20:08 IP:61.66.xxx.xxx 未訂閱
引言: 0. DECLARE @myUser AS nvarchar(256) SET @myUser = USER 可以取得 username 1. 先不管能不能抓到 DB Server 的 USERID 先想一下, 你抓 DB Server 的 USERID 有效嗎? USERID 用的是 Login DB 的 username, 不會是你的資料庫中的人員資料吧 ==> 推測, 不然你的 server login ID 也要有 2000萬個嗎?? 你的遠端程式 login ID 應該都是用同一個吧, 應該也不是用 NT 帳號那種 2. 所以問題應該沒有那麼複雜 只要從 Inserted / Deleted table 就行了 CREATE TRIGGER tr_FieldUpdate ON [dbo].[Customer] AFTER INSERT, UPDATE AS UPDATE Customer SET USERNAME= '', USERPASS= '', USERKEY= '', USERSHORT= '' WHERE USERNAME IN (SELECT Ins.USERNAME FROM INSERTED Ins)
的確, 原本問題就沒有那麼複雜, silence 兄, 你誤解我的意思了, username, userid 不是 sql server login 的資料, 以上的欄位全部是我在customer 資料庫中的欄位, 舉例來說 遠端客戶上傳一筆 "John","0001","Right","MR.J","Man","Taipei"(username,userpass,userkey,shortname,sex,city六個欄位) 當送回sql主機時, 六個field分別記錄上述資料, 然後我要把它變成 '','','','',"Man","Taiepi", 也就是上面提到的欄位要即時清除, 我指的是這 筆record(有可能是新增或update回來), 不知這樣可否瞭解? 另外, (SELECT Ins.USERNAME FROM INSERTED Ins) 我不是很清楚它的含義 可否解釋一下 Ins.USERNAME , Ins是指? 謝謝!
arvinhsu
一般會員


發表:0
回覆:10
積分:7
註冊:2003-04-03

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-04 22:41:59 IP:203.74.xxx.xxx 未訂閱
SELECT Ins.USERNAME FROM INSERTED Ins 這一段主要是要取得你Insert時的資料也就是最新的資料 在問一下你這個Table沒有PK嗎? 要不然這樣也是要修改到所有有關John的資料喔...
timhuang
尊榮會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-07-04 22:56:19 IP:61.62.xxx.xxx 未訂閱
請參考 mssql help 檔內的 使用 inserted 與 deleted 資料表 以下為部分節錄之資料, 給 p.d.兄參考一下. 其實 inserted, deleted table 是一種可以在 trigger 中使用很方便的參考表, 在新增資料時會有 inserted 表, 刪除資料時會有 deleted, 異動資料時則兩者同時都會存在的! 使用 inserted 與 deleted 資料表 在觸發程序陳述式中使用的兩種特殊資料表:deleted 與 inserted 資料表。Microsoft® SQL Server™ 2000 會自動建立與管理這些資料表。您可以使用這些暫存、記憶體常駐的資料表來測試某些資料修改的效果,以及設定觸發動作的條件;但是,您無法直接改變資料表中的資料。 觸發程序中使用 inserted 與 deleted 資料表的主要目的在於: 延伸資料表之間的參考完整性。 在檢視表底下的基底資料表中插入或更新資料。 檢查錯誤,並根據錯誤採取行動。 搜尋資料變動前後之資料表狀態的差異,並依據這些差異採取動作。 deleted 資料表會儲存因 DELETE 及 UPDATE 陳述式而受影響的資料列副本。在 DELETE 或 UPDATE 陳述式執行時,從觸發程序資料表中被刪除的資料列會傳送到 deleted 資料表,在正常的情形下,deleted 資料表與觸發程序資料表並不會有共同的資料列。 inserted 資料表會儲存被 INSERT 及 UPDATE 陳述式影響的資料列副本。在插入或更新交易時,新的資料列會同時被加至觸發程序資料表與 inserted 資料表。inserted 資料表中的資料列即為觸發程序資料表中新加入資料列的副本。 更新交易就像是插入後再刪除的動作;首先,舊資料列被複製到 deleted 資料表,接著將新資料列再複製到觸發程序資料表以及 inserted 資料表。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-07-05 02:37:21 IP:61.66.xxx.xxx 未訂閱
感謝各位的指導, 雖然大家的講的很清楚, 但因為個人在Trigger上是"初試 啼聲", 所以我實在看得很迷糊, 我先在此結案, 再按各位提供的來源研究 研究, 如果有進一步的問題, 再向各位請教了! 為鼓勵新進網友, 我把這題 給silence了
系統時間:2024-05-18 21:37:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!