Sql-Server

數據庫事件但不是觸發器

  • February 10, 2021

這是一個關於一般 DB 內部工作的問題,而不是特定於實現或範式,儘管歡迎對某些技術的回答。我在問是否有辦法監聽數據庫收到了什麼命令,或者像讀取數據庫的內部日誌,至少是最後的更改。我需要這樣的功能來查找表是否有更改,如果有,請讀取已更改的特定行。假定不會發生對列的更改。

我只是數據庫的偵聽器,因此我無法編寫觸發器。

今天大多數主要的 DBMS 產品都有這樣的功能:它可能被稱為

  • 變更數據擷取(Oracle、SQL Server)
  • 邏輯複製(Postgres、MySQL)

這些工具中的大多數都在發布/訂閱模型上執行,並建立在 DBMS 的內置事務日誌之上,以提供更改事件流。通常日誌記錄的數量會略有增加,因為主鍵必須包含在流中,而不僅僅是有關哪些塊已更改的物理資訊。

在組織上,您可能會遇到與保守的 DBA 和組織實施此類事情的阻力(我在嘗試實施 Oracle CDC 時遇到過幾次),而這不太可能是他們已經切換到或正在使用開放式的問題。源 DBMS(更易於更改)。

對於 SQL Server,您可以通過三個選項來查看系統內發生的情況。首先是動態管理視圖 (DMV)。但是,它們要麼是即時的、此查詢正在執行,要麼是聚合。此外,它只是目前記憶體中的內容。另一種選擇是查詢儲存。它也是一個聚合,但預設情況下會分解為一小時的塊。它可以讓您更清楚地了解特定查詢何時執行。最後一個是擴展事件。這為您提供了有關查詢的詳細資訊,非常精細。它的弱點是它會為您提供大量數據,除非您在擷取時仔細過濾它。

Oracle 也有類似的功能。我不太了解 ElasticSearch,但我相信它也是。

唯一可以保證讓您更改特定行的是擴展事件。

如前所述,您可以將其他審計工具添加到數據庫中,但它們確實會改變資料結構和數據管理,因此在比較是否要擷取所有更改或您想要監視查詢並根據查詢找出更改。

引用自:https://dba.stackexchange.com/questions/285007