我尝试创建一个记录插入,更新和删除信息的触发器。为简单起见,我只是尝试为插入创建触发器,而不包括用户和日期等信息。
我的引用表是列:
-DefaultPropertiesID
-Key _
值
-ProcessID_FK(外键)
============================
我的审计表是:
-OldDefaultID
-OldKey _
-OldValue
-OldProcessID_FK
我当前触发器的代码是:
old
但我该怎么做呢?
create trigger DPTrigger on DefaultProperties
for insert as
begin
insert into DefaultProperties_Audit(OldDefaultID, OldKey_, OldValue, OldPid_FK, Modifier, EntryDate, Operation)
select DefaultPropertiesID, Key_, Value, ProcessID_FK, user_name(), GETDATE(), 'insertion' from inserted
end
当我尝试编译上面的版本时,它会抛出一个错误。我理解另一种方法是为插入,更新和删除创建三个单独的触发器。我只是想知道我是否可以把它浓缩成一个?
此外,如果我明确说明,似乎我可以将其浓缩为一个 如果更新(col1)或更新(col2)或更新(col3) 但这似乎也可能带来一些错误。
任何提示/提示,使其工作并改进它将非常感激。
答案 0 :(得分:0)
ASE触发器支持update()
功能;没有insert()
函数。
虽然update()
函数可用于插入触发器,但update()
通常用于更新触发器以确定哪些列已更新。
在这种特殊情况下,由于您计划将整行插入审计表中,并且显然(?)所有列都是新的,您可能会发现以下内容更有用:
create trigger dbo.DPTrigger on dbo.DefaultProperties
for insert as
begin
insert into DefaultProperties_Audit(OldDefaultID, OldKey_, OldValue, OldPid_FK)
select DefaultPropertiesID, Key_, ProcessID_FK, Value from inserted
end
有关create trigger
语法,示例以及触发器编码的一些讨论,请参阅ASE - Reference Manual: Commands - create trigger
有关触发器使用的更多讨论,因为它与RI和事务控制有关,请参阅ASE - TSQL Users Guide - Triggers: Enforcing RI constraints
关于将插入/更新/删除代码合并到单个触发器中的更新问题......
确定在插入,更新或删除时触发的触发器的最简单方法是测试名为inserted
和deleted
的伪表中是否存在行;您可以在每次触发器需要知道父DML的类型时测试存在,或者测试一次并存储在@variable中:
create trigger ...
begin
declare @operation char(1) -- 'I'nsert, 'U'pdate, 'D'elete
if exists(select 1 from inserted)
select @operation = 'I'
if exists(select 1 from deleted)
select @operation = case when @operation = 'I' then 'U' else 'D' end
... reset of trigger code ...
end