SQL2000 trigger運用 |
答題得分者是:silence
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
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 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 在這先擬清幾個問題: 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 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
請參考 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |