【问题标题】:How to use SQL trigger to record the affected column's row number如何使用 SQL 触发器记录受影响列的行号
【发布时间】:2011-02-07 18:52:44
【问题描述】:

我想要一个“updateinfo”表,以便在另一个表上记录每个更新/插入/删除操作。

我在 oracle 中写过这个:

CREATE TABLE updateinfo (rnumber NUMBER(10), tablename VARCHAR2(100 BYTE), action VARCHAR2(100 BYTE), UPDATE_DATE date)

删除触发器 TRI_TABLE;
创建或替换触发器 TRI_TABLE
删除、插入或更新后
开启演示
新旧如旧
每一行
开始
如果插入则
插入 updateinfo(rnumber,tablename,action,update_date) 值(rownum,'demo', 'insert',sysdate);
elsif 然后更新
插入 updateinfo(rnumber,tablename,action,update_date) 值(rownum,'demo', 'update',sysdate);
elsif 删除 then
插入 updateinfo(rnumber,tablename,action,update_date) 值(rownum,'demo', 'delete',sysdate);
如果结束;
-- 例外
-- 其他时候
-- 考虑记录错误,然后重新引发
-- 提高;
结束三表;

但是在检查 updateinfo 时,所有 rnumber 列都为零。 有没有办法检索正确的行号?

【问题讨论】:

  • 从中得出的结论是,在数据的关系模型中,没有“行号”之类的东西——这个概念根本不适用。

标签: oracle triggers


【解决方案1】:

唯一的选择是使用“演示”表的主键列。

ROWNUM 不是你要找的,read the explanation

ROWID 看起来像是一个解决方案,但实际上并非如此,因为它是shouldn't be stored for a later use

【讨论】:

    【解决方案2】:

    ROWNUM 不是您想的那样。 ROWNUM 是一个计数器,仅在执行语句的上下文中才有意义(即,结果的第一行始终具有 rownum=1 等)。我猜您正在寻找用于标识行的 ROWID。

    【讨论】:

    • 那么如何在触发器中使用 ROWID 呢?
    • ROWID 不标识行。唯一标识符标识一行。 ROWID 是指向 a 之后发生变化的行的物理位置的指针,例如 expdp impdp。
    • 罗伯特:是的,使用该表的主键比使用 ROWID 更可取
    • Freeman:正如罗伯特所说,最好使用主键。要使用rowid,您必须将rnumber 的数据类型更改为varchar2 或rowid,然后使用“new.rowid”而不是rownum。但是用demo的主键代替会好很多;如果您使用生成的主键(通常是从序列填充的“id”列或“guid”列),请使用该数据类型并分别放置 new.id。 new.guid 到 rnumber 中。如果您为某些表连接了主键,那么您显然打算做的事情会更加复杂。
    猜你喜欢
    • 1970-01-01
    • 2019-10-21
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多