在Sybase ASE 15.7中触发审计表

时间:2017-07-05 14:11:42

标签: triggers sybase audit

我尝试创建一个记录插入,更新和删除信息的触发器。为简单起见,我只是尝试为插入创建触发器,而不包括用户和日期等信息。

我的引用表是列:

默认属性

-DefaultPropertiesID

-Key _

-ProcessID_FK(外键)

============================

我的审计表是:

DefaultProperties_Audit

-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) 但这似乎也可能带来一些错误。

任何提示/提示,使其工作并改进它将非常感激。

1 个答案:

答案 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

关于将插入/更新/删除代码合并到单个触发器中的更新问题......

确定在插入,更新或删除时触发的触发器的最简单方法是测试名为inserteddeleted的伪表中是否存在行;您可以在每次触发器需要知道父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