2010-01-07 44 views
1

我有了一個用戶ID列反正是有可在SQL服務器數據庫觸發器

我有了ID,名稱的用戶表中的訂單表中使用的緩存數據,

我會喜歡有一個數據庫觸發器,顯示按名稱插入,更新或刪除。

所以我結束了每個單獨的數據庫觸發器上這兩個表之間的連接。我認爲這樣會更好,如果我可以預先將用戶映射到ID,然後在我的觸發器上重複使用「lookup」。 。這可能嗎?

DECLARE @oldId int 
DECLARE @newId int 
DECLARE @oldName VARCHAR(100) 
DECLARE @newName VARCHAR(100) 

SELECT @oldId = (SELECT user_id FROM Deleted) 
SELECT @newId = (SELECT user_id FROM Inserted) 

SELECT @oldName = (SELECT name FROM users where id = @oldId) 
SELECT @newName = (SELECT name FROM users where id = @newId) 

    INSERT INTO History(id, . . . 
+0

請注意,如果您更新一個事務中的兩條記錄,則此觸發器將失敗,因爲已刪除和插入的子查詢將返回兩條記錄。 – 2010-01-07 03:11:00

回答

3

好消息,您已經在使用緩存!您的SELECT name FROM users WHERE id = @id將獲取緩衝池高速緩存頁面的名稱。相信你我,你將無法構建出比這更好的調整,更高的規模和更快的緩存。

結果緩存對於客戶端來說可能是有意義的,在這種情況下,可以完全避免往返數據庫。或者,緩存一些複雜和長時間運行的查詢結果可能很有價值。但是在存儲的proc/trigger內部,緩存簡單索引查找結果絕對沒有價值。

0

你如何打開更改數據捕獲,然後擺脫所有這些代碼?

編輯補充休息:

其實,如果你正在考慮來獲取用戶名標量函數的可能性,那就不要。這是非常糟糕的,因爲標量函數是程序性的問題。你會喜歡的東西更好:

INSERT dbo.History (id, ...) 
SELECT i.id, ... 
FROM inserted i 
JOIN deleted d ON d.id = i.id 
JOIN dbo.users u ON u.user_id = i.user_id; 

由於user_id是獨一無二的,你必須讓它在每次使用FK,它不應該是一個主要問題。但是,是的,你需要在每個觸發器中重複這個邏輯。如果您不想重複邏輯,請使用SQL 2008中的更改數據捕獲。

+0

由於其2008年的功能,並沒有直接在下面實現。 – GrayWizardx 2010-01-07 03:14:49

+0

但是OP沒有指定一個版本,它是2010年,並且SP1已經出現了很長時間......所以我可以希望,不是嗎? – 2010-01-07 03:30:38