Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新Oracle 11g后通过触发器更新值_Sql_Oracle_Triggers_Oracle11g - Fatal编程技术网

Sql 更新Oracle 11g后通过触发器更新值

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

我正在开发一个小型的库数据库,我不想让某人更新某人的ID。但我需要在更新后和每个语句中使用(我被告知这是Oracle的默认值)。因此,基本上,如果有人更新客户信息并更改他/她的ID或键入错误,触发器将自动再次将其更新为旧值。问题是Oracle不允许我在每个语句中使用:NEW和:OLD。这个问题有解决办法吗

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;

您可以测试该值是否正在更改,但这似乎是不必要的。

使用下面的触发器代码。 已完成的更改:

  • 使用更新前而不是更新后
  • 将ID的值设置为以前的值。(永远不会修改ID字段)

    创建或替换触发器ALTER\u ID\u触发器
    在更新客户信息之前
    开始
    SET:NEW.ID=:OLD.ID
    结束

  • 注意:

    • 不能在视图上创建BEFORE触发器
    • 您可以更新:新值
    • 无法更新旧值

    使用以下代码进行触发。 已完成的更改:

  • 使用更新前而不是更新后
  • 将ID的值设置为以前的值。(永远不会修改ID字段)

    创建或替换触发器ALTER\u ID\u触发器
    在更新客户信息之前
    开始
    SET:NEW.ID=:OLD.ID
    结束

  • 注意:

    • 不能在视图上创建BEFORE触发器
    • 您可以更新:新值
    • 无法更新旧值

    客户
    客户
    两个不同的表格吗?还是同一张桌子?语句级触发器无法访问
    :new
    :old
    伪记录,您需要一个行级触发器。它们是相同的,我忘了翻译它。没有其他方法可以在没有行级触发器的情况下将旧ID设置为新ID吗(如果您想对数据进行行级更改,为什么不需要行级触发器?如果您不想允许某人更改
    customer.id
    ,为什么您甚至要在应用程序中将该字段设置为可编辑字段,或者从应用程序中首先生成
    UPDATE
    语句?这样做似乎很奇怪允许应用程序修改
    id
    ,然后创建一个触发器将数据更改回原来的状态。另外,像
    customer
    这样的表很可能会有子表,其外键会自动阻止
    id
    被更改。这里讨论的主题非常透彻:Are
    cliente
    customer
    两个不同的表?还是它们是同一个表?语句级触发器无法访问
    :new
    :old
    伪记录,您需要一个行级触发器。它们是相同的,我忘了翻译它。没有其他方法可以将旧ID设置为新ID而无需g行级触发器?:(如果您想对数据进行行级更改,为什么不需要行级触发器?如果您不想允许某人更改
    customer.id
    ,为什么您甚至要在应用程序中将该字段设置为可编辑字段,或者从应用程序中首先生成
    UPDATE
    语句?这样做似乎很奇怪允许应用程序修改
    id
    ,然后创建一个触发器,将数据更改回原来的状态。另外,像
    customer
    这样的表可能会有子表,其外键会自动阻止
    id
    被更改。这个主题在这里讨论得相当透彻:它在添加后的工作de>对于每一行
    因为
    引用
    在行级别中允许其在添加
    之后的工作对于每一行
    因为
    引用
    在行级别中允许