非规范化——在 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
.
我的大学项目有一个任务,我对 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 TRIGGERcreate or replace TRIGGER CatalogueBefore
BEFORE INSERT OR UPDATE ON CATALOGUE
FOR EACH ROW
BEGIN
PACK.SUPPCODE:=:NEW.SUPPLIERCODE;
END;
然后我在目录 table
上添加了一个 AFTER INSERT TRIGGERcreate 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
.