Triggers Sybase ASE 15.7中审核表的触发器
我正在尝试创建一个触发器,记录有关插入、更新和删除的信息。为了让事情变得简单,我只是尝试为插入创建一个触发器,而不包括诸如用户和日期之类的信息 我的引用表包含以下列: 默认属性 -默认属性ID -钥匙_ -价值观 -ProcessID_FK(外键) ============================ 我的审计表是: DefaultProperties\u审计 -OldDefaultID -老钥匙_ -旧价值 -OldProcessID_FK 我当前触发器的代码是:Triggers Sybase ASE 15.7中审核表的触发器,triggers,sybase,audit,Triggers,Sybase,Audit,我正在尝试创建一个触发器,记录有关插入、更新和删除的信息。为了让事情变得简单,我只是尝试为插入创建一个触发器,而不包括诸如用户和日期之类的信息 我的引用表包含以下列: 默认属性 -默认属性ID -钥匙_ -价值观 -ProcessID_FK(外键) ============================ 我的审计表是: DefaultProperties\u审计 -OldDefaultID -老钥匙_ -旧价值 -OldProcessID_FK 我当前触发器的代码是: create trigg
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*我已剪切粘贴了您的原始代码。。。忘记从选择
的列列表中删除参数;我已经更新了我的答案。。。现在就试试看,行得通!精彩的。最后一件事哈哈,请看原来的帖子