【问题标题】:How I can create a trigger with a derived attribute?如何创建具有派生属性的触发器?
【发布时间】:2020-10-25 05:07:28
【问题描述】:

我有一个音像商店的数据库,为了问我暴露的问题,我考虑过更新与演员对应的年龄属性,但这没有意义(如下面的示例所示)

CREATE TABLE dobs ( dob date, age number(3));
insert into dobs values ((to_date('1999-10-04','yyyy-mm-dd')),NULL);

CREATE OR REPLACE FUNCTION get_age
(
    fnacimiento date
) 
return int 
is edad int;
begin
    select floor(months_between(sysdate,dob)/12) into edad
    from dobs
    where dob=fnacimiento;
    return edad;
end get_age;

CREATE OR REPLACE TRIGGER agec before INSERT OR UPDATE ON dobs
FOR EACH ROW
BEGIN
   :new.age := get_age(:new.dob);
END;

【问题讨论】:

    标签: oracle plsql oracle11g database-trigger


    【解决方案1】:

    您不需要函数来更新该列。甚至不需要使用 SELECT 语句。只需将触发器重新排列为:

    CREATE OR REPLACE TRIGGER agec BEFORE INSERT OR UPDATE ON dobs
    FOR EACH ROW
    BEGIN
       :new.age := floor(months_between(sysdate,:new.dob)/12);
    END;
    

    【讨论】:

    • before 不是触发器名称的一部分。它是触发器声明中BEFORE INSERT OR UPDATE 的一部分。
    • 当然,谢谢@Luke Woodward 我错过了这个部分。
    【解决方案2】:

    Trigger 将在插入或更新表中的记录时触发一次,因此您将在执行插入/更新时获得参与者的年龄,而不是今天。

    所以更好的解决方案是创建一个view 而不是trigger,如下所示:

    Create or replace view dobs_vw
    As
    Select t.* floor(months_between(sysdate,t.dob)/12) as age_asof_today
      From your_table t
    

    【讨论】:

    • 是的,我知道这是最好的选择,但我必须通过触发来完成
    • 无法使用触发器。
    • 听起来像是学校作业。 (在流媒体服务时代,视频商店还存在吗?:-))请注意,尽管有分配要求,但存储任何东西的“年龄”本质上是一个糟糕的设计,你会希望在“真实”中避免世界'。没有其他原因,它立即开始漂移到它存储的实例不正确。最好在运行时存储“开始日期”(出生日期,出生日期)并在运行时计算“年龄”,如“sysdate - start_date”,当你离开 c
    • 这是一个项目,我从数据库中管理电影和连续剧,并指定我必须创建派生属性的触发器,而年龄是我唯一想到的事情
    • 显然是学校作业。你为什么不和你的导师讨论呢。解释你做了什么以及它导致的死胡同,并询问更适合的数据元素的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    相关资源
    最近更新 更多