Sql 更新Oracle 11g后通过触发器更新值
我正在开发一个小型的库数据库,我不想让某人更新某人的ID。但我需要在更新后和每个语句中使用(我被告知这是Oracle的默认值)。因此,基本上,如果有人更新客户信息并更改他/她的ID或键入错误,触发器将自动再次将其更新为旧值。问题是Oracle不允许我在每个语句中使用:NEW和:OLD。这个问题有解决办法吗Sql 更新Oracle 11g后通过触发器更新值,sql,oracle,triggers,oracle11g,Sql,Oracle,Triggers,Oracle11g,我正在开发一个小型的库数据库,我不想让某人更新某人的ID。但我需要在更新后和每个语句中使用(我被告知这是Oracle的默认值)。因此,基本上,如果有人更新客户信息并更改他/她的ID或键入错误,触发器将自动再次将其更新为旧值。问题是Oracle不允许我在每个语句中使用:NEW和:OLD。这个问题有解决办法吗 CREATE OR REPLACE TRIGGER alter_id_trigger AFTER UPDATE ON CUSTOMER BEGIN UPDATE CUSTOMER SET
CREATE OR REPLACE TRIGGER alter_id_trigger
AFTER UPDATE ON CUSTOMER
BEGIN
UPDATE CUSTOMER SET ID = :OLD.ID
WHERE ID = :NEW.ID;
END;
谢谢大家! 我想您需要一个更新前触发器:
CREATE OR REPLACE TRIGGER alter_id_trigger
BEFORE UPDATE ON CUSTOMER
BEGIN
SET :NEW.ID = :OLD.ID
END;
您可以测试该值是否正在更改,但这似乎没有必要。我想您需要一个更新前触发器:
CREATE OR REPLACE TRIGGER alter_id_trigger
BEFORE UPDATE ON CUSTOMER
BEGIN
SET :NEW.ID = :OLD.ID
END;
您可以测试该值是否正在更改,但这似乎是不必要的。使用下面的触发器代码。 已完成的更改:
创建或替换触发器ALTER\u ID\u触发器
在更新客户信息之前
开始
SET:NEW.ID=:OLD.ID
结束代码>
- 不能在视图上创建BEFORE触发器
- 您可以更新:新值
- 无法更新旧值
创建或替换触发器ALTER\u ID\u触发器
在更新客户信息之前
开始
SET:NEW.ID=:OLD.ID
结束代码>
- 不能在视图上创建BEFORE触发器
- 您可以更新:新值
- 无法更新旧值
客户
和客户
两个不同的表格吗?还是同一张桌子?语句级触发器无法访问:new
或:old
伪记录,您需要一个行级触发器。它们是相同的,我忘了翻译它。没有其他方法可以在没有行级触发器的情况下将旧ID设置为新ID吗(如果您想对数据进行行级更改,为什么不需要行级触发器?如果您不想允许某人更改customer.id
,为什么您甚至要在应用程序中将该字段设置为可编辑字段,或者从应用程序中首先生成UPDATE
语句?这样做似乎很奇怪允许应用程序修改id
,然后创建一个触发器将数据更改回原来的状态。另外,像customer
这样的表很可能会有子表,其外键会自动阻止id
被更改。这里讨论的主题非常透彻:Arecliente
和customer
两个不同的表?还是它们是同一个表?语句级触发器无法访问:new
或:old
伪记录,您需要一个行级触发器。它们是相同的,我忘了翻译它。没有其他方法可以将旧ID设置为新ID而无需g行级触发器?:(如果您想对数据进行行级更改,为什么不需要行级触发器?如果您不想允许某人更改customer.id
,为什么您甚至要在应用程序中将该字段设置为可编辑字段,或者从应用程序中首先生成UPDATE
语句?这样做似乎很奇怪允许应用程序修改id
,然后创建一个触发器,将数据更改回原来的状态。另外,像customer
这样的表可能会有子表,其外键会自动阻止id
被更改。这个主题在这里讨论得相当透彻:它在添加引用
在行级别中允许其在添加之后的工作对于每一行
因为引用
在行级别中允许