sql - 更新触发器?

标签 sql oracle triggers

我正在尝试执行 e 触发器,它执行了但没有按照我的意愿执行。

好的,这些是我需要的两个表

create table Properties(  
        idProperties number(20) NOT NULL,
        Typee varchar2(20) NOT NULL,
        SquareMeters varchar2(20) NOT NULL,
        Rooms number(20) NOT NULL,
        ConstructionDate date NOT NULL,
        FloorLocation varchar(20),
        Price number(20) NOT NULL,
        CityView varchar2(20),
        DateOfInsert date NOT NULL,
        DateOfExiration date NOT NULL,
        Address_FK number(20),
        Service_FK number(20),
        OwnerAgent_FK number(20),
        Status_FK number(20),
        PropertyService_FK number(20))

create table Status(
         idStatus number(20) NOT NULL,
         statustype varchar2(20))

这是触发器

CREATE OR REPLACE TRIGGER Property_Update 

AFTER UPDATE ON Properties REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW 


BEGIN
DECLARE
val_new VARCHAR2(20);
val_app VARCHAR2(20);
BEGIN
    select idstatus into val_new from status where STATUSTYPE='New';
    select idstatus into val_app from status where STATUSTYPE='Approved';        

IF :OLD.status_fk=val_new AND :NEW.status_fk=val_app THEN
   UPDATE Properties SET DateOfExiration=(sysdate+90) WHERE  
idProperties= :NEW.idProperties;


END IF; 


END;
END;

当状态类型从"new"更改为“已批准”时,我想更新 sysdate + 90

我正在更新它

update properties set status_fk = 2 where idproperties = 12;

它会更改表属性上的 forieng 键 status_fk 但不会将过期日期更新为 sysdate + 90?

知道为什么会这样吗?

最佳答案

您需要在 BEFORE UPDATE 触发器中执行此操作,您需要的代码是:

IF :OLD.status_fk=val_new AND :NEW.status_fk=val_app THEN
   :NEW.DateOfExiration  := (sysdate+90);
END IF;

即您分配触发器中的值,您不执行另一个更新。

它必须是 BEFORE 触发器,因为您不能修改 AFTER 触发器中的值。

关于sql - 更新触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8883443/

相关文章:

c# - 在从查询返回字符串值之前检查异常

sql - 如何按查询顺序获取一组的所有日期?

Oracle 数据库触发失败回滚

mysql - Oracle DB - 无序列主键自增列

sql - 定时触发删除数据

c# - DataTemplate 多个数据触发相同的元素和属性

mysql - 如何在不检查 SQL 中任何字段的情况下只选择一行一次

php - SQL 查询在 phpmyadmin 中运行,在 php 中不起作用

oracle - 带时间戳的自动分区

java - Parse 服务器上的 Webhooks