1

こんにちは、データベース用の基本的な SQL トリガーを作成しようとしています。本質的に、私のデータベースは偽の銀行システムです。ロードファイルを以下に示します

-- prefix a2 is to

DROP TABLE a2_loanr;
DROP TABLE a2_accr;
DROP TABLE a2_customer;
DROP TABLE a2_account;
DROP TABLE a2_loan;
DROP TABLE a2_bankbranch;
DROP TABLE a2_bank;

CREATE TABLE a2_bank (
routingcode   VARCHAR(200)  PRIMARY KEY,
name          VARCHAR(200)  NOT NULL,
address       VARCHAR(200)  NOT NULL
);

INSERT INTO a2_bank VALUES
( '123456','ASB', '3 gladstone rd');
INSERT INTO a2_bank VALUES
( '123556','BNZ', '5 gladstone rd');
INSERT INTO a2_bank VALUES
( '12456','KIWIBANK', '3 gladstone rd');


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     VARCHAR(200)  NOT NULL,
FOREIGN KEY(routing_code) REFERENCES a2_bank(routingcode),
PRIMARY KEY(branch_num, routing_code)
);
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         VARCHAR(200)  NOT NULL,
contract_date  DATE          NOT NULL
);

INSERT INTO a2_loan VALUES
( '323', 'Mortgage', '$2000000', TO_DATE('11-03-1994', 'DD-MM-YYYY') );
INSERT INTO a2_loan VALUES
( '33', 'Car', '$2000', TO_DATE('12-08-1994', 'DD-MM-YYYY') );
INSERT INTO a2_loan VALUES
( '3243', 'Pesonal', '$875', TO_DATE('14-06-1994', 'DD-MM-YYYY') );
INSERT INTO a2_loan VALUES
( '6', 'Mortgage', '$400500', TO_DATE('11-06-1994', 'DD-MM-YYYY') );

CREATE TABLE a2_account (
acc_num       CHAR(10)  PRIMARY KEY,
type           VARCHAR(20)  NOT NULL,
balance         VARCHAR(10)  NOT NULL
);
INSERT INTO a2_account VALUES
( '2539267332', 'Savings', '20');
INSERT INTO a2_account VALUES
( '8237893378', 'Cash', '300');
INSERT INTO a2_account VALUES
( '2378723936', 'Cheque', '75');
INSERT INTO a2_account VALUES
( '2378723937', 'Savings', '175');


CREATE TABLE a2_customer (
ird_num         CHAR(8)  PRIMARY KEY,
name            VARCHAR(200)  NOT NULL,
address         VARCHAR(200)  NOT NULL,
phone           VARCHAR(20)
);
INSERT INTO a2_customer VALUES
( '25362672',  'Stan Yel', '5 Wanna way', '02010201');
INSERT INTO a2_customer VALUES
( '83783783', 'Cam Birch', '34 Trada st', '02302020202');
INSERT INTO a2_customer VALUES
( '23723367', 'Jeff King', '5 Queens st', '38982383');
INSERT INTO a2_customer VALUES
( '54637822',  'John Smith', '24 Queen st', '38922383');


CREATE TABLE a2_accr (
ird_num                CHAR(8)  NOT NULL ,
account_num            CHAR(10)  NOT NULL,
FOREIGN KEY(ird_num) REFERENCES a2_customer(ird_num),
FOREIGN KEY(account_num) REFERENCES a2_account(acc_num)
);
INSERT INTO a2_accr VALUES
( '25362672', '2539267332');
INSERT INTO a2_accr VALUES
( '83783783', '8237893378');
INSERT INTO a2_accr VALUES
( '83783783', '2378723937');

CREATE TABLE a2_loanr (
ird_num                CHAR(8)  NOT NULL ,
loan_num            CHAR(10)  NOT NULL,
FOREIGN KEY(ird_num) REFERENCES a2_customer(ird_num),
FOREIGN KEY(loan_num) REFERENCES a2_loan(loan_num)
);
INSERT INTO a2_loanr VALUES
( '54637822', '323');
INSERT INTO a2_loanr VALUES
( '23723367', '33');

COMMIT;

このデータベースを使用して、派生属性「total_loan」を作成しようとしています。これは、各銀行支店が任意の時点で持っているローンの総額です。(各支店の融資総額a2_bankbranch)

現時点では、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 amount ON a2-loan
FOR EACH ROW
BEGIN
IF INSERTING THEN
UPDATE a2_bankbranch
SET total_loan =
WHERE
ELSIF UPDATING THEN
UPDATE a2_bankbranch
SET total_loan =
WHERE
ELSE --deleting
UPDATE a2_bankbranch
SET total_loan =
WHERE
END;

現時点では、トリガーを正しく機能させるのに苦労しています。また、load.sql ファイルを使用してトリガーを実行するにはどうすればよいですか?

4

3 に答える 3

0

だから、これが本当のシステムではないことはわかっていますが...

2 つの行が同時に変更された場合、トリガーを実行するたびに、他のセッションで行われた変更が反映されないため、トリガーを使用してサマリー レコードを正常に維持することはできません。これに対する唯一の解決策は、ブランチ テーブルへのアクセスをシリアル化するためのロック メカニズムを提供することです。

更新を実行するために毎時間/毎日実行されるスケジュールされたジョブを持つだけで、ブランチ レコードを非同期的に更新することもできます。

または、高速更新マテリアライズド ビューを使用して、支店ごとにローン データを集計することもできます。これは、1 日/1 か月あたりのローン、合計金額などもレポートできる効率的な方法です。

于 2015-09-03T14:03:51.277 に答える