SQL> CREATE TABLE CUSTOMER (
SNO NUMBER,
ID VARCHAR2(8),
NAME VARCHAR2(16),
CREATED_ON DATE
);
表が作成されました。
SQL> INSERT INTO CUSTOMER VALUES(1,'XXX-0001', '永久 太郎', DATE '2000-01-01');
1行が作成されました。
SQL> CREATE OR REPLACE VIEW RIVUS.REST_CUSTOMER AS
SELECT
SNO, ID||'' AS ID, NAME, CREATED_ON+0 AS CREATED_ON
-- ↑この2箇所で仮想列に変換 ↑
FROM CUSTOMER;
ビューが作成されました。
列の UPDATE が制限されたか確認
SQL> UPDATE REST_CUSTOMER SET SNO=SNO+1;
1行が更新されました。
-- SNO 列の更新は可能
SQL> UPDATE REST_CUSTOMER SET ID='DUMMY';
UPDATE REST_CUSTOMER SET ID='DUMMY'
*
行1でエラーが発生しました。:
ORA-01733: ここでは仮想列は使用できません。
-- ID 列の更新は制限された
SQL> SELECT * FROM REST_CUSTOMER;
SNO ID NAME CREATED_ON
---------- ---------------- -------------------------------- -------------------
2 XXX-0001 永久 太郎 2000-01-01 00:00:00
INSERT を可能にする INSTEAD OF トリガー
この方法を用いると仮想項目への INSERT も制限されるので登録処理を許可したい場合には
元表 に対してデータを登録するか、
INSTEAD OF トリガーを設置して制限を迂回するという回避策を行なう必要がある。
当然であるが、トリガーの種類を変更すると更新はできるが登録はできないようにすることも可能である。
INSERT できないことを確認
SQL> INSERT INTO REST_CUSTOMER VALUES(3,'XXX-0003', '三日 寝太郎', DATE '2000-03-03');
INSERT INTO REST_CUSTOMER VALUES(3,'XXX-0003', '三日 寝太郎', DATE '2000-03-03')
*
行1でエラーが発生しました。:
ORA-01733: ここでは仮想列は使用できません。
SQL> CREATE OR REPLACE TRIGGER RIVUS.REST_CUSTOMER#TR
INSTEAD OF INSERT ON REST_CUSTOMER
FOR EACH ROW
BEGIN
INSERT INTO CUSTOMER (SNO, ID, NAME, CREATED_ON)
VALUES (:NEW.SNO, :NEW.ID, :NEW.NAME,:NEW.CREATED_ON);
END;
/
トリガーが作成されました。
SQL> INSERT INTO REST_CUSTOMER VALUES(3,'XXX-0003', '三日 寝太郎', DATE '2000-03-03');
1行が作成されました。
SQL> SELECT * FROM REST_CUSTOMER;
SNO ID NAME CREATED_ON
---------- ---------------- -------------------------------- -------------------
2 XXX-0001 永久 太郎 2000-01-01 00:00:00
3 XXX-0003 三日 寝太郎 2000-03-03 00:00:00