簡體   English   中英

我可以創建一個 SQL (Oracle) 觸發器,根據另一個表的更新增加每日計數嗎?

[英]Can I create a SQL (Oracle) Trigger that increments a daily count based off another table's updates?

我們有一張人們可以申請的表格。 作為用戶 go 通過應用程序更新表。 提交表單后,有一個標志從 1 更改為 2。我們希望每天計算提交並跟蹤它。 因此,我們將有一個單獨的表格,其中有一列表示日期,一列表示當天提交的總數。 我希望每次將行從 1 更新到 2 時都會增加每日計數。我在想使用類似這樣的觸發器:

CREATE TRIGGER daily_submission_count
AFTER UPDATE on [form_info_table]
FOR EACH ROW
WHEN (form_info_table.status == 2)
BEGIN
     UPDATE [daily_count_table].daily_count SET daily_count = daily_count + 1;

當然,使用這種方法,我將不得不使用在凌晨 12:00 運行的另一條規則來初始化該行,該規則將日期和計數設置為 0。我無法找到編寫 SQL 的正確方法,或者如果有更好的方法對此的態度。

可以這樣做,但這是一個壞主意。 想想那個更新 FORM_INFO_TABLE 並在結束交易之前離開辦公桌的人(或者更現實地說,服務停止或崩潰)。 現在你在 DAILY_COUNT_TABLE 上有一個打開的鎖。

現在,每一次增加該計數的嘗試都已死在水中。 您的系統停止運行。 即使在一切順利運行的最佳情況下,您也有效地將系統減少到一次事務,因為增加每日計數的人會阻止其他人,即使只是片刻。

我要看的第一件事是:在沒有額外的數據庫結構的情況下推導出每日計數有多貴,即,運行真的那么貴嗎:

SELECT COUNT(*)
FROM   FORM_INFO_TABLE
WHERE  STATUS = 2
AND    <some appropriate date range>

因為如果這足夠快(對於您需要運行它的次數),那么您就完成了。

如果僅此一項太慢,則下一個選項可能是僅對狀態為 2 的記錄的索引,例如

CREATE INDEX MY_INDEX ON FORM_INFO_TABLE ( CASE WHEN STATUS = 2 THEN DATE_COLUMN END )

因為那時該索引中的唯一條目是包含狀態 2 的行。僅掃描該索引的適當查詢是您的下一個選擇 - 不需要額外的代碼,但 STATUS=2 行的少量事務開銷可以有效地獲得每日計數.

如果您確實有一些復雜的結構,而以上兩種方法都不可能,那么您可以查看排隊機制,其中觸發器位於

CREATE TRIGGER daily_submission_count
AFTER UPDATE on [form_info_table]
FOR EACH ROW
WHEN (form_info_table.status == 2)
BEGIN
  insert into pending_info values (:new.primary_key_col);
  --- (or the same with DBMS_AQ if you prefer)
END

然后是不時出現的后台任務,以整理這些行並適當地匯總數據。

但它必須是一組非常特殊的情況才能保證這種復雜性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM