Sql-Server

ALTER TABLE DISABLE TRIGGERDISABLE TRIGGER 有什麼區別?

  • October 28, 2021

我的公司使用數據庫觸發器在一個數據庫上記錄 DDL,尋找 DDL,包括:

  • ALTER_TABLE
  • CREATE_TRIGGER
  • ALTER_TRIGGER
  • DROP_TRIGGER

當我使用 禁用或啟用觸發器時ALTER TABLE x DISABLE TRIGGER tiud_x,會使用數據庫觸發器記錄此更改。

當我使用 禁用或啟用觸發器DISABLE TRIGGER tiud_x ON x時,不會記錄此更改。

對我來說,DISABLE TRIGGER看起來ENABLE TRIGGER像“一個奇怪的技巧”來避免觸發數據庫觸發器,因為它們在功能上似乎是等效的。和****有什麼區別?ALTER TABLE DISABLE TRIGGER``DISABLE TRIGGER

可悲的是:

  1. 禁用觸發器不會改變觸發器,就像關閉燈不會改變燈泡一樣。然而,有趣的是它沒有被擷取,但當它發生時ALTER_TRIGGER仍然設法更新。modify_date¯- (ツ)-
  2. 您的 DDL 觸發器會擷取ALTER TABLE變化,因為這會顯式更改表- 它在命令中如此說明。儘管您可能會爭辯說,無論您使用何種語法,禁用觸發器都會更改表(我同意您的觀點,特別是因為最終結果是相同的),但不同之處在於,這目前是 DDL 觸發器擷取的空白,並且沒有事件(您可以在此回饋項DISABLE_TRIGGER中投票讓他們修復它,但這已經坐在那裡完全忽略了十多年)。這是 Stack Overflow 上一個相關的、可以理解的未回答問題。 同樣,很久以前我記得事件沒有擷取

ALTER_``RENAME,這後來被添加為一個事件。

您必須以DISABLE TRIGGER其他方式擷取,例如審計或擴展事件(我在這裡討論過):

在這種情況下,您不妨以相同的方式擷取ALTER TABLE變化,以便它們都記錄在同一個地方。

一個非常愚蠢的想法是sys.triggers每 n 秒/分鐘/小時輪詢一次,並在狀態發生is_disabled變化時記錄下來。這不會讓您看到是誰做的,但至少您會知道它發生了,並且與其他審計一起,您可以縮小範圍。

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