非规范化——在 Oracle 中使用触发器维护冗余

Denormalization - maintaining redundancy by using triggers in Oracle

我的大学项目有一个任务,我对 table 进行了非规范化,现在我必须实施触发器以保持冗余。相应地按照本书进行操作后,我陷入了最后一步,我无法理解它。 我有两个 tables - 供应商和目录

**Supplier** SupplierCode (primary key) SupplierName **Catalogue** SupplierCode (foreign key) CatalogueCode (both SupplierCode and CatalogueCode form a primary key) CatalogueName DateCreated SupplierName (redundant column for denorm purposes)

在目录中插入新行时 table 我希望同一 table 中的 SupplierName 字段根据插入的 SupplierCode 进行填充。

到目前为止我有: 我们还需要创建一个包

create or replace PACKAGE "PACK" AS 
SUPPCODE NUMBER:=0;
SUPPNAME VARCHAR2(50);
END;

我在目录 table

上创建了一个 BEFORE INSERT TRIGGER
create or replace TRIGGER CatalogueBefore
BEFORE INSERT OR UPDATE ON CATALOGUE
FOR EACH ROW
BEGIN
PACK.SUPPCODE:=:NEW.SUPPLIERCODE;
END;

然后我在目录 table

上添加了一个 AFTER INSERT TRIGGER
create or replace TRIGGER "AddNewCatalogue"
AFTER INSERT ON CATALOGUE
FOR EACH ROW
DECLARE
V_SUPPNAME SUPPLIER.SUPPLIERNAME%TYPE;
BEGIN
SELECT SUPPLIERNAME INTO V_SUPPNAME
FROM SUPPLIER
WHERE SUPPLIERCODE= PACK.SUPPCODE;
PACK.SUPPNAME:=V_SUPPNAME;
END;

完成所有这些后,我的包裹中保存了供应商名称 PACK.SUPPNAME,但我的问题是现在如何在目录 table 中插入新行时使用此变量?我现在被困在这个问题上有一段时间了,我可能遗漏了一些明显的东西。 :) 任何帮助表示赞赏。谢谢

P.S 请忽略大写字母与小写字母 - 我刚刚从我的母语中翻译了名字。 :)

谢谢

I have denormalized a table and now I have to implement a trigger in order to maintain redundancy

[...]

When a new row is inserted in the Catalogue table I want that SupplierName field in the same table gets populated based on the SupplierCode which was inserted.

如果这些是您唯一的要求,那么您只需要 一个 触发器用第二个 table 中的数据更改记录。类似的东西,也许:

CREATE OR REPLACE TRIGGER CatalogueBefore
BEFORE INSERT OR UPDATE ON Catalogue
FOR EACH ROW
BEGIN
  SELECT S.SupplierCode INTO :NEW.SupplierCode
    FROM Supplier S
    WHERE S.SupplierName = :NEW.SupplierName;
END;

这样,在更新或插入 table Catalogue 时,SupplierCode 将被来自 Supplier table 的代码覆盖。请参阅 http://sqlfiddle.com/#!4/d79e0/1 以获取实际示例。

一些注意事项:

  • 为此,Supplier.SupplierName 也应该 是一个唯一索引。事实上,所有的事情都是基于这样的假设,这是一个 natural key.
  • 您很可能需要另一个触发器来处理 Supplier table 中的更新。比如说,当一个供应商的名称发生变化时,新名称将必须传播到 Catalogue.