【问题标题】:Trigger problems when it comes to Supertypes in SQL/DBeaver在 SQL/DBeaver 中涉及超类型时触发问题
【发布时间】:2021-05-31 08:43:23
【问题描述】:

你好 Stackoverflowers!

我是 SQL/DataOracleModeler 的新手,我已经到了无法继续前进的地步。

解释一下:

我有一个表“车辆”作为超类型,“赛格威”“自行车”和“汽车”作为子类型。

我为它们添加了一个鉴别器(S 代表赛格威,F 代表 Fahhrad,A 代表 Auto(德语翻译))

我现在的问题是:

Dbeaver 不喜欢我的触发器。

先来一张图给大家看的更清楚: Model of my Super/Sub-types

这里是其中一个触发器:

  INSERT OR
  UPDATE OF Inventar_ID ON Segway FOR EACH ROW DECLARE d CHAR (8);
  BEGIN
    SELECT A.FahrzeugArt_FahrzeugArt
    INTO d
    FROM Fahrzeug A
    WHERE A.Inventar_ID = :new.Inventar_ID;
    IF (d              IS NULL OR d <> 'S') THEN
      raise_application_error(-20223,'FK Segway_Fahrzeug_FK in Table Segway violates Arc constraint on Table Fahrzeug - discriminator column FahrzeugArt_FahrzeugArt doesn''t have value ''S''');
    END IF;
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
    NULL;
  WHEN OTHERS THEN
    RAISE;
  END;
  /

但是当我启动 SQL 时,它要求我绑定参数?首先,为什么?

真正的问题是。我不能只说:

INSERT INTO AUTO VALUES (blablabla)

因为他说: 找不到父键。

没问题 - 我可以创建一个 ID 为 1 的父级“车辆”,然后说 INSERT INTO AUTO (ID1,...) 但是当我 SELECT ID1 我得到一个所有列都是两倍的表。第一个都是 NULL 值,第二个是用语句 INSERT INTO AUTO (ID1,...) 填充的

但是 Super/Subtypes 的目标不应该是这样的吗?

我真的很沮丧,因为我们与 Data Oracle Modeler 和 DBeaver 一起工作,所以无法再在 Internet 上进行查找,而且找不到太多东西。

现在我要问你,我在这里错过了什么?

是的,我查看了论坛,但在这里我并没有真正找到类似的问题。 我希望任何人都可以提供帮助,我很抱歉打扰。提前致谢!

【问题讨论】:

    标签: sql triggers dbeaver subtype


    【解决方案1】:

    有多种方法可以对超类型/子类型进行建模,但您所做的并不是其中之一。如果你要物理化超类型,那么它应该包含所有公共列,然后子类型将只包含特定于每个子类型的列 - 你似乎已经复制了它们。

    无论如何,对于您拥有的模型类型,对于您拥有的每个“逻辑”记录,首先您需要插入超类型记录,然后您需要插入子类型记录。

    触发器的目的是什么?大概您拥有插入这两种类型记录所需的所有数据,那么为什么不直接使用插入语句呢?

    【讨论】:

    • 您好,尼克,感谢您的评论。我知道超类型的属性看起来很长,但与子类型不同。它们都有许多相同的属性,只是有些不同。超类型应该是抽象的。它甚至不应该能够制造新的“车辆”。应该只能创建新的 Segway、汽车或自行车。我认为触发器应该做的是,如果我说 Vehicle_Art = 'S' 它应该检测到它是 Segway ......我希望这对你有更多帮助了解我的问题,感谢您的回答!
    • 当你物理化一个逻辑超类型/子类型模型时,你要么创建一个包含公共列的父表和子类型特定列的子表,要么你不创建父表并包含所有公共每个子类型特定表中的列。您尝试采用哪种方法 - 因为您的解决方案目前看起来并不像?
    • 我很抱歉 - 所以我实际上想插入一个新的 Segway 而不创建任何新的“车辆”。但它不允许我因为缺少父键。
    • 没错!您的设计需要 Segway 记录和相应的父车辆记录(1:1 关系)。如果这是您想要的,那么它是一个完全可以接受的设计模式(尽管不是您实现它的方式)。但是,如果您不想要父车辆表而只拥有车辆类型表,那么这也是一种可接受的设计模式 - 您只需将车辆级别的所有公共列非规范化到每个车辆类型表中
    猜你喜欢
    • 2017-09-08
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    相关资源
    最近更新 更多