Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Triggers Sybase ASE 15.7中审核表的触发器_Triggers_Sybase_Audit - Fatal编程技术网

Triggers Sybase ASE 15.7中审核表的触发器

Triggers Sybase ASE 15.7中审核表的触发器,triggers,sybase,audit,Triggers,Sybase,Audit,我正在尝试创建一个触发器,记录有关插入、更新和删除的信息。为了让事情变得简单,我只是尝试为插入创建一个触发器,而不包括诸如用户和日期之类的信息 我的引用表包含以下列: 默认属性 -默认属性ID -钥匙_ -价值观 -ProcessID_FK(外键) ============================ 我的审计表是: DefaultProperties\u审计 -OldDefaultID -老钥匙_ -旧价值 -OldProcessID_FK 我当前触发器的代码是: create trigg

我正在尝试创建一个触发器,记录有关插入、更新和删除的信息。为了让事情变得简单,我只是尝试为插入创建一个触发器,而不包括诸如用户和日期之类的信息

我的引用表包含以下列:

默认属性 -默认属性ID

-钥匙_

-价值观

-ProcessID_FK(外键)

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

我的审计表是:

DefaultProperties\u审计 -OldDefaultID

-老钥匙_

-旧价值

-OldProcessID_FK

我当前触发器的代码是:

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
但是我该怎么做呢

create trigger DPTrigger on DefaultProperties
    for insert, update, delete as
    if insert then
        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
    endif
    if update then
        doSomething()
    endif
    if delete then
        doSomethingElse()
    endif
当我试图编译上面的版本时,它抛出了一个错误。我知道另一种方法是为insert、update和delete创建三个单独的触发器。我只是想知道我能不能把它浓缩成一个

而且,如果我明确地说 如果更新(col1)或更新(col2)或更新(col3) 但这似乎也可能带来一些错误


任何提示/提示,使这项工作和改善将不胜感激

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
语法、示例和触发器编码的一些讨论,请参阅

有关与RI和事务控制相关的触发器用法的更多讨论,请参阅


至于更新的问题,询问如何将插入/更新/删除代码合并到单个触发器中

确定在insert、update或delete上触发触发器的最简单方法是测试名为
inserted
deleted
的伪表中是否存在行;您可以在每次触发器需要知道父DML的类型时测试是否存在,或者测试一次并存储在@变量中:

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

您是否可以更新您的问题,以包括您正在使用的Sybase产品(ASE、SQLAnywhere、IQ、Advantage)以及版本?您可能还希望回顾您过去的问题,以期通过向上投票和/或接受有助于解决您的问题的答案来提供反馈;当然,这主要是一系列游戏化,但有些人可能会选择把时间花在更有机会进行游戏化的问题上feedback@markp谢谢你的反馈!该产品/版本为:Adaptive Server Enterprise/15.7感谢您的帮助,我必须执行上述操作才能使其正常工作(请参见原始问题)。但是,当我在DefaultProperties表中插入一行时,从命令-insert-into DefaultProperties(Key,ProcessID,FK,Value)值('k1',1',v1'中的第1行开始出现此错误-->错误命令行错误:1列:1错误报告-SQL错误:表DefaultProperties\u Audit中的OldKey列不允许空值。为什么要对
DefaultProperties\u Audit
表执行4次单独插入?是否确实要在
DefaultProperties\u Audit
中为插入到
DefaultProperties
的每1行创建4个单独的行?如果您确实需要4个不同的行,那么您必须将
DefaultProperties\u Audit
中的所有列定义为NULL,或者确保它们具有默认值。ah有意义。但当我尝试您编写的内容时,我遇到了以下错误:错误从命令中的第1行开始-在dbo.DefaultProperties上创建触发器dbo.DPTrigger作为开始插入DefaultProperties\u Audit(OldDefaultID,OldKey,OldValue,OldPid\u FK)选择(DefaultPropertiesID,Key,ProcessID\u FK,Value)从插入的结束错误报告-靠近“,”的语法不正确。*arg*我已剪切粘贴了您的原始代码。。。忘记从
选择
的列列表中删除参数;我已经更新了我的答案。。。现在就试试看,行得通!精彩的。最后一件事哈哈,请看原来的帖子