如何使用SQL触发器记录受影响列的行号

发布于 2024-08-28 10:03:57 字数 786 浏览 3 评论 0原文

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

在oracle中我写了这样的:

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

DROP TRIGGER TRI_TABLE;
创建或替换触发器 TRI_TABLE
删除、插入或更新后
开启演示
以新为新,以旧为旧
对于每一行
开始
如果插入则
插入 updateinfo(rnumber,表名,操作,update_date ) 值(rownum,'demo','insert',sysdate);
然后 elsif 更新
插入updateinfo(rnumber,tablename,action,update_date)values(rownum,'demo','update',sysdate);
elsif 删除然后
插入updateinfo(rnumber,tablename,action,update_date)values(rownum,'demo','delete',sysdate);
结束如果;
-- 异常
——当其他人
-- 考虑记录错误然后重新引发
-- 提高;
结束TRI_表;

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

I want to have an 'updateinfo' table in order to record every update/insert/delete operations on another table.

In oracle I've written this:

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

DROP TRIGGER TRI_TABLE;
CREATE OR REPLACE TRIGGER TRI_TABLE
AFTER DELETE OR INSERT OR UPDATE
ON demo
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
if inserting then
insert into updateinfo(rnumber,tablename,action,update_date ) values(rownum,'demo', 'insert',sysdate);
elsif updating then
insert into updateinfo(rnumber,tablename,action,update_date ) values(rownum,'demo', 'update',sysdate);
elsif deleting then
insert into updateinfo(rnumber,tablename,action,update_date ) values(rownum,'demo', 'delete',sysdate);
end if;
-- EXCEPTION
-- WHEN OTHERS THEN
-- Consider logging the error and then re-raise
-- RAISE;
END TRI_TABLE;

but when checking updateinfo, all rnumber column is zero.
is there anyway to retrieve the correct row number?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

野稚 2024-09-04 10:03:58

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

ROWNUM is not what you think it is. ROWNUM is a counter that has only a meaning within the context of one execution of a statement (i.e. the first resulting row always has rownum=1 etc.). I guess you are looking for ROWID, which identifies a row.

于我来说 2024-09-04 10:03:57

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

ROWNUM 不是您要查找的内容,阅读说明

ROWID 看起来像是一个解决方案,但实际上不是,因为它应该'不能存储以供以后使用

The only option is to use primary key column of your "demo" table.

ROWNUM is not what you are looking for, read the explanation.

ROWID looks like a solution, but in fact it isn't, because it shouldn't be stored for a later use.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文