我加入了一個團隊,其中所有表都有觸發器。它似乎主要用于審計,例如,誰創建或更新它和日期。
到目前為止,我學到的是,他們可能很糟糕,看著 Brent Ozar 的東西,這一切都讓我擔心。我從未使用過它們,并且傾向于遠離它們,如果需要,通常在 API 端設定這些資料。
- 這是否相當于 2 個更新而不是一個?
- 即使它們沒有改變,它似乎也會更新所有列!?看起來對嗎?我的意思是,如果我更新一行并設定新的價格,是否也會觸發其他未更改的欄位的更改,因此也會導致索引更改,當 StartDate 上沒有任何更改時。
基于問題 2。我做了一個測驗,它似乎告訴索引它已經改變了,即使我沒有改變該索引中的列!所以在這種情況下,我說更新價格并且只更新價格,但我想觸發器告訴它該列中的所有內容都已更改。該特定指數中沒有價格。

這一切都讓我很擔心!
這是否意味著如果我在表上有任何索引;任何更新都會觸發所有列的更改,因為所有列都已更改?從而導致必須不斷更新索引的問題?
與此示例一類似:
ALTER TRIGGER [dbo].[MyTrigger]
ON [dbo].[MyTable]
INSTEAD OF UPDATE
AS
BEGIN
SET NOCOUNT ON
IF NOT EXISTS (
-- We have a check here to stop inserting overlapping data
)
BEGIN
UPDATE
p
SET
p.MyId = i.MyId,
p.StartDate = i.StartDate,
p.EndDate = i.EndDate,
p.Price = i.Price,
p.CreatedBy = i.CreatedBy,
p.CreatedDate = i.CreatedDate,
p.AuditUser = CASE WHEN UPDATE(AuditUser) THEN i.AuditUser ELSE SUSER_SNAME() END,
p.AuditDate = SYSUTCDATETIME(),
p.AuditApp = RTRIM(ISNULL(APP_NAME(),''))
FROM
PriceValues p
INNER JOIN
inserted i ON p.Id = i.Id
END
ELSE
BEGIN
RAISERROR ('Cant update due to overlap', 16, 101);
END
END
如果這會開始咬我們,我正在尋求就最佳攻擊角度達成共識。如果這是一個問題,我需要詳細說明原因以及我們可以做些什么來消除這個問題?一些事情要回到團隊和業務并向他們解釋。
uj5u.com熱心網友回復:
觸發器可能會導致問題,但它們本身并不可怕。對資料庫執行正常的性能監控以確定是否存在需要解決的問題。
uj5u.com熱心網友回復:
在您的特定示例中,觸發器用于為審計列注入附加資訊。
作為instead of觸發器它是僅對預期行的單次更新。
觸發器有可能對性能產生不利影響,并且如果您將業務邏輯封裝在其中可能會產生問題,因為它們經常被忽視或未經測驗,而且如果沒有正確理解,或者例如從哪里移植,則是錯誤的常見原因另一個 RDBMS,其操作與 SQL Server 類似但不完全相同。
在你的情況下,觸發器應該是這樣的,簡短而甜蜜。但是,if not exists您選擇保留的部分可能會影響性能- 通常要知道某些東西是否不存在,SQL Server 必須掃描它可用的最窄支持索引,這可能會影響并發性等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/340084.html
標籤:sql-server
