2010-01-07 61 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