一些背景:我有一个普通的表和一个“归档”表。归档表包含普通表所拥有的每一行的记录,因此我们可以跟踪行更新和删除。这些表是相同的,除了具有少量额外字段(id,datetime,user,insert / update / delete)的归档表。标准表包含插入/更新/删除时的一个触发器。触发器将所有新行(插入或更新)复制到存档表中,并删除行(删除)。
有些列可以为空。在归档表中,所有字段都可以为空(除了'archivy'之外。
触发器没有开始尝试或结束尝试。它没有交易声明。任何意想不到的异常都会立即敲掉那个东西(四处阅读,troggers的爆发中止了我认为的批次)。
触发器包含
之类的语句insert into archive.table(field1, field2, field3 etc)
select (field1, field2 etc)
但是,我很有意思的是,如果将任何新列添加到主表中,则即使未将新字段添加到存档表或“插入”语句中,也可以继续进行无错处理。我不确定使用'*'是一个好主意(场地位置,表现等)
如果main和trigger之间的列不匹配,我很想发生异常。 如果在
中遗漏了任何字段,我也很想发生异常insert into archive.table (field1, field2, field3 etc )
select (field1,field2 etc)'
我认为可能使用信息架构在这里很有用。
我还注意到,在触发器中,RAISERROR('blah blah', 17, 1)
不会立即中止整个批处理/程序/事务。
那么,问题是 - 这是跟踪记录插入/更新/删除的最佳(或合理)方式吗?
如果对列发生任何更改,任何人都知道使触发器失败的方法吗?
如何让raiserror中止整个批次?
那不是要求太多!
谢谢大家。