2010-01-15 70 views
1

我想在我的表數據更改時進行一些計算。但是,我正在手動更新我的表格,並一次複製粘貼大約3000行。這使我的觸發器工作了3000次,但我希望它只觸發一次。SQL Server觸發器工作 - 只觸發一次

有沒有辦法做到這一點?

謝謝。

回答

1

如果通過「手動」,你的意思是你複製並粘貼到某個用戶界面工具(如Access dataGrid)或類似的東西,那麼該工具可能會在每行發出一個插入語句,在這種情況下,運氣不好的話,數據庫觸發器將在每個插入語句中執行一次。正如其他答案所提到的那樣,如果您可以使用單個插入語句將行直接插入數據庫中,那麼觸發器將只觸發一次。

+0

是的我正在使用訪問 – stckvrflw 2010-01-15 15:06:41

+0

是的,正如我想的那樣......恐怕只要你堅持這樣做手動,通過訪問tableview(或任何被稱爲) - 你卡住了。 – 2010-01-15 16:31:12

5

你的聲明是什麼?

如果您有多個插入那麼它會觸發您正在運行的每個插入。如果你想讓它多刀片只執行一次,你必須:

  1. 編寫插入一個單獨的語句,如insert into foo select * from bar
  2. ,您的觸發不能爲每一行

其他的可能性是:

  1. 禁用觸發
  2. 執行的插入
  3. 將觸發代碼在存儲過程中
  4. 運行存儲過程,如果你是在一個單獨的語句修改3000行
0

,您的觸發不會閃光3000次。你的觸發器會觸發一次,虛擬「刪除」表中將有3000行。

+0

我認爲通過'手動'的OP可能意味着他正在複製和粘貼到一些像訪問網格之類的UI工具或類似的東西,在這種情況下,該工具可能會發出每行一個插入語句...... – 2010-01-15 14:56:29

1

該問題是由於您手動粘貼3000行而引起的。你真的有2個解決方案。你可以這樣做關閉觸發:

ALTER TABLE tablename DISABLE TRIGGER ALL 
-- do work here 
ALTER TABLE tablename ENABLE TRIGGER ALL 

,然後在運行觸發的內容然後結束或者你可以把你的3000列到一個臨時表,然後一次插入它們。這隻會設置1個觸發器。如果這還不夠,請給我們更多關於你想要做什麼的信息。

+0

那麼我沒有明確的解決你的第一種解決方法。你說「在這裏工作」,但我正在手動做這項工作?你是什​​麼意思,我想我錯了。順便說一句我正在使用訪問時複製粘貼。 – stckvrflw 2010-01-15 15:08:29

+0

我的意思是運行ALTER TABLE tablename DISABLE TRIGGER ALL,然後粘貼你的行,然後運行ALTER TABLE tablename ENABLE TRIGGER ALL。一旦完成,您需要運行觸發器中的腳本,以便更新所有這些行。 – 2010-01-15 16:49:07

0

如果您限制如何將數據導入到每行插入一次的系統中,我建議您將數據導入到中間表中,然後從中間表中插入到最終表中。