【发布时间】:2012-06-04 09:43:32
【问题描述】:
我正在尝试创建一个触发器,该触发器在表 component 上运行并将 UPDATE、DELETE 和 INSERT 操作记录到表 component_history
CREATE TRIGGER component_hist
ON component
AFTER INSERT, UPDATE, DELETE
AS
DECLARE
@tr_action varchar(8),
@tr_id_compoment int,
@tr_name varchar(max),
@tr_value int
IF COLUMNS_UPDATED() <> 0 -- delete or update?
BEGIN
SET @tr_action = 'UPDATE'
ELSE -- delete
BEGIN
SET @tr_action = 'DELETE'
END
INSERT INTO component_history VALUES (@tr_id_component, @tr_name, @tr_value, @tr_action);
如何将表 component 中的列 (id, name, value) 中的信息发送到 component_history?
我试过了:
SET
@tr_id_component = component.id,
@tr_name = component.name,
@tr_value = component.value
但它报告:
消息 4104,级别 16,状态 1,过程 component_hist,第 22 行
无法绑定多部分标识符“component.id”。
【问题讨论】:
-
这里回答您问题的一些元素:stackoverflow.com/questions/1751715/…
-
假设已经成功处理了至少一个插入(因此表中存在行),
EXISTS (SELECT * FROM component)将始终为真。并且触发器每条语句触发一次,而不是每行触发一次,因此考虑将值放入变量中总是错误的。 -
这是第二件事,它是ORACLE的构造,但是MSSQL不支持BEFORE语句,所以我现在只使用AFTER(我不知道如何解决BEFORE): (((
标签: sql sql-server-2008