【发布时间】:2015-12-20 03:42:51
【问题描述】:
我正在尝试为假数据库创建触发器。假设那里 是 BANK-BRANCH 的一个名为“total_loan”的派生属性,用于维护每个分行的贷款总额。我正在尝试设计一个触发器来维护这个派生属性。因此,我的触发器似乎停止了我的 load.sql 脚本,如下所示:
CREATE TABLE a2_bankbranch (
name VARCHAR(200) NOT NULL,
branch_num VARCHAR(200) NOT NULL,
address VARCHAR(200) NOT NULL,
routing_code VARCHAR(200) NOT NULL,
total_loan NUMBER(38),
FOREIGN KEY(routing_code) REFERENCES a2_bank(routingcode),
PRIMARY KEY(branch_num, routing_code)
);
@trig.sql
INSERT INTO a2_bankbranch VALUES
( 'ASB', '5', '3 gladstone rd', '123456', '');
INSERT INTO a2_bankbranch VALUES
( 'ASB', '4', '28 stevee rd', '123456', '');
CREATE TABLE a2_loan (
loan_num CHAR(10) PRIMARY KEY,
type VARCHAR(200) NOT NULL,
amount NUMBER(38) NOT NULL,
contract_date DATE NOT NULL,
branch_num VARCHAR(200) NOT NULL,
routing_code VARCHAR(200) NOT NULL,
FOREIGN KEY(routing_code) REFERENCES a2_bank(routing_code),
Foreign KEY(branch_num) REFERENCES a2_bankbranch(branch_num)
);
INSERT INTO a2_loan VALUES
( '323', 'Mortgage', '2000000', TO_DATE('11-03-1994', 'DD-MM-YYYY'), '5', '123456');
INSERT INTO a2_loan VALUES
( '33', 'Car', '2000', TO_DATE('12-08-1994', 'DD-MM-YYYY'), '5', '123456' );
INSERT INTO a2_loan VALUES
( '3243', 'Pesonal', '875', TO_DATE('14-06-1994', 'DD-MM-YYYY'), '5', '123456' );
INSERT INTO a2_loan VALUES
( '6', 'Mortgage', '400500', TO_DATE('11-06-1994', 'DD-MM-YYYY'), '5', '123456' );
我的触发器如下所示,初始插入不起作用,我不确定在 WHERE 和 SET 行中放入什么来更新和删除 trig.sql如下所示
-- Create a trigger that will update the total loan amount
--that each bank brach may have
CREATE OR REPLACE TRIGGER ttl
AFTER INSERT OR UPDATE OR DELETE OF total_loan ON a2-bankbranch
FOR EACH ROW
BEGIN
IF INSERTING THEN
UPDATE a2_loan
SET total_loan = total_loan + :NEW.amount
WHERE branch_num = :NEW.bank_num;
ELSIF UPDATING THEN
UPDATE a2_loan
SET total_loan = total_loan + amount
WHERE
ELSE --deleting
UPDATE a2_loan
WHERE
END;
任何帮助将不胜感激
【问题讨论】:
-
您已将此标记为 SQL Server 和 Oracle,这两个不同的数据库。您实际使用的是哪一个?我假设甲骨文。我猜应该删除 SQL Server 标记。您的数据类型没有意义——您将数值存储在
varchar2列中。我希望您希望在loan表上定义触发器,但没有明显的方法可以将贷款与数据模型中的分支联系起来。 -
是的,很抱歉使用 Oracle。如您所见,我有点迷茫,触发器的最终结果应该是,如果我更改特定客户拥有的贷款金额,数据库将自动更新该客户所在的 bank_branch 给出的总贷款金额成员在。这有帮助吗?
-
您如何知道客户属于哪个分支机构?我在您的数据模型中没有看到任何内容告诉我们如何将贷款或客户映射到分支机构。您是否期望答案需要您发布的所有表格?如果不是这样,将事情缩减到只关注感兴趣的表格会使问题更清楚。
-
很抱歉,当创建新贷款时,数据库需要更新 bank_branch 属性 total_loan。我将快速编辑代码以仅包含必要的表格
-
添加
loan_num6 时应该更新哪个a2_bankBranch行?您的数据模型似乎缺少一种方法来表明特定贷款归特定分支机构所有。我猜您可能希望将branch_num和routing_code添加到a2_loan表中,作为a2_bankBranch的外键来指示这种关系。除非一笔贷款可以申请多个分行。