2012-06-13 27 views
3

這是一個特定的場景。我需要實現的是:如何檢測表格是否在我的應用程序之外添加或刪除了行?

  1. 如果有人插入或刪除我的應用程序的UI外指定表 一行或多行,那麼就應該檢測表 被修改。
  2. 它應該而不是使用觸發器。

這是它需要做的:

  1. 微分如果它已被刪除或插入。
  2. 檢測做了改變或其中它被改變。
  3. 如果用戶同時執行相同數量的插入和刪除操作。這在技術上可以算作變更,因此不需要檢測爲插入和刪除。

這是我們認爲可以做的工作: 創建將存儲看着表名稱的表,它擁有的行數和確認鍵,姑且稱之爲integrity_tbl。插入或刪除後,更新行數和驗證密鑰。只有驗證密鑰有效時才更新行數。每次比較失敗時使驗證密鑰失效。當需要數據完整性驗證時,對錶中的行進行計數並與integrity_tbl進行比較。

您認爲這是一個好方法,還是應該嘗試其他方法?

我們爲此使用了Delphi和Firebird。 如問,我們正在使用IBX連接到數據庫。但邏輯問題不是訪問數據庫的方式。

+0

不知道它應該被標記爲德爾福在所有。 o.o'' – EMBarbosa

+0

這取決於你如何計算你的integrity_tbl。 – philnext

+1

爲什麼不使用觸發器? –

回答

0

從每個表計算MD5(或其它)校驗或簽名,存儲在某個地方,比如一個.ini文件,另一個表(具體到這個目的),等等。

+0

這不符合要求:「如果用戶同時執行相同數量的插入和刪除操作」,則不計算在內。刪除一行並插入另一行會改變校驗和或簽名。 (此外,目的是審計和評論具體說「沒有觸發器,因爲他們可以被禁用」 - 如果用戶可以禁用觸發器,一個.ini文件肯定不會是一個解決方案。)沒有downvote,但它不會工作。 –

+0

@KenWhite最糟糕的問題是,在每次插入或刪除後,計算整個表格中的MD5校驗和會很痛苦。我期待'count'快得多。 – EMBarbosa

+0

@EMBarbosa:我同意這是一個考慮不周的解決方案。這就是爲什麼我說這不起作用。

0

火鳥有一個非常漂亮用於通知客戶機是否以及何時特定數據庫中的任何地方發生了變化的機制。該機制被稱爲Firebird Events。閱讀該文檔以正確理解其功能。

通常,事件用於觸發器或存儲過程。您使用關鍵字POST_EVENT <event_name>將特定事件發送給所有連接的客戶端。 <event_name>可以是最多127個字符的任何字符串。然後,在Delphi中,您需要使用名爲TIBEvents的組件(或舊版Delphi版本中的TIBEventAlerter)。在那裏,您使用Events屬性,您可以在其中指定一個或多個您有興趣接收的<event_name>s。之後,您需要編寫代碼TIBEvents.OnEventAlert,您可以在每次觸發時對所有已註冊的事件做出反應。

+0

謝謝,但它不會這樣工作。要在刪除時觸發事件,我必須使用觸發器。這是毫無疑問的。另外,如果應用程序未被使用,它就不能註冊對事件的興趣。 – EMBarbosa

+0

有一個'Registered'屬性,當你不想接收任何事件時你可以設置爲False。無論如何,我仍然不明白你不想或不能使用觸發器的原因。你能解釋一下嗎? – LightBulb

+0

這不是我不想要的。這是軟件必須完成的一項法律。我不擅長翻譯,但有如下所述:「軟件之外不應有任何自動方式來停用完整性驗證機制」。因此,如果在應用程序未運行時需要觸發器才能工作,則不符合要求。 – EMBarbosa

相關問題