助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26777
問題を開く
EMPLOYEES表の構造を確認して下さい。



次のSQL文でEMPLOYEES表を実表とするビューを作成しました。

 CREATE OR REPLACE VIEW v_emp
  AS 
 SELECT employee_name, hiredate, salary
 FROM employees
 WHERE department_id = 1
 WITH CHECK OPTION;

V_EMPビューに関する説明として、正しいものはどれですか。

正解

DEPARTMENT_IDが1である部署の従業員データを更新できる

解説

ビューの作成時、WITH CHECK OPTIONオプションを指定すると、ビューを通じて実表のデータを操作する場合に、ビューの定義時に指定したWHERE句の条件を満たしていないデータの追加や更新ができなくなります。

V_EMPビューは、
・DEPARTMENT_ID列の値が1
という条件が指定されいるので、この条件を満たすデータの追加、更新のみ行うことができます。

以上より、
・DEPARTMENT_IDが1である部署の従業員データを更新できる
が正解となります。

その他の選択肢については次のとおりです。

・データの追加ができる
・データの削除ができない
NOT NULL制約が定義されているEMPLOYEE_ID列がビューに含まれていないため、設問のビューを通じてEMPLOYEES表にデータを追加することはできません。データの更新と削除は行うことができますが、WITH CHECK OPTIONが指定されているので、それもDEPARTMENT_IDが1であるデータに限られます。

・DEPARTMENT_IDが5である部署の従業員データを更新できる
ビューの定義により、DEPARTMENT_IDが1であるデータのみ更新することができます。

参考

ビューの作成はCREATE VIEW権限を持つユーザーによって行われます。

 CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW ビュー名 [(別名 [,別名...])]
  AS
 副問合せ
 [WITH CHECK OPTION [CONSTRAINT 制約名]]
 [WITH READ ONLY [CONSTRAINT 制約名]];

 
 
SQLを表示
CREATE VIEW v_emp
 AS
SELECT employee_id, employee_name, hiredate, department_id
FROM employees
WHERE salary <= 450000;

SELECT * FROM v_emp;


CREATE VIEW文のオプションは次の通りです。



[FORCE/NOFORCE]
CREATE VIEW文でビューを作成する際に、FORCEオプションを指定すると、実表の有無にかかわらずビューを作成することができます。
メンテナンスや検証時に、一時的に実表が存在しないがビューを作成しておきたい場合などに利用します。


 
SQLを表示
SELECT * FROM emp3;

CREATE FORCE VIEW view1
 AS 
SELECT employee_id, employee_name, salary
FROM emp3;


ただし、ビューの参照時に実表が存在しない場合はエラーとなります。


 
SQLを表示
SELECT * FROM view1;


NOFORCEオプションを指定すると、実表がある場合のみビューが作成され、実表がない場合はエラーとなります。


 
SQLを表示
SELECT * FROM emp3;

CREATE NOFORCE VIEW view1
AS
SELECT employee_id, employee_name, salary
FROM emp3;


なお、CREATE VIEW文ではNOFORCEがデフォルトとなりますので、FORCE、NOFORCEどちらも指定しない場合は、実表がある場合のみビューを作成することができます。

[WITH CHECK OPTION]
ビューの作成時、WITH CHECK OPTIONオプションを指定すると、ビューを通じて実表のデータを操作する場合に、ビューの定義時に指定したWHERE句の条件を満たしていないデータの追加や更新ができなくなります。


 
SQLを表示
CREATE VIEW v_emp
 AS
SELECT employee_name, salary
FROM employees
WHERE department_id = 5
 AND salary >= 400000
WITH CHECK OPTION;

UPDATE v_emp SET salary = 300000;

UPDATE v_emp SET salary = 600000;


CREATE VIEW文でビューを作成する場合は、次の点に注意が必要です。

・副問合せのSELECT句に計算式や関数を指定する場合は、CREATE VIEW文で別名を指定するか、SELECT句の計算式や関数に列別名を指定する


 
SQLを表示
CREATE VIEW v_emp
 AS
SELECT employee_id, employee_name, salary*12, hiredate
FROM employees;


・ビューの列名を定義する場合は、副問合せのSELECT句に指定する列の数と同数の列名を定義する


 
SQLを表示
CREATE VIEW v_emp (id, name, sal, hireadte)
 AS
SELECT * FROM employees
WHERE salary >= 500000;


なお、ビューの構造は表と同様にDESCコマンドで確認することができます。


 
SQLを表示
DESC v_emp;
上に戻る

「データの削除ができない」の選択肢に関する解説について

投稿日 2026/05/08

当該の解説には、

"・データの削除ができない
NOT NULL制約が定義されているEMPLOYEE_ID列がビューに含まれていないため、設問のビューを通じてEMPLOYEES表にデータを追加することはできません。データの更新と削除は行うことができますが、WITH CHECK OPTIONが指定されているので、それもDEPARTMENT_IDが1であるデータに限られます。"

と書かれており、削除できる行がDEPARTMENT_IDが1であるデータに限られる理由が、WITH CHECK OPTIONに言及されています。WITH CHECK OPTIONは更新や追加の際のデータの条件を見るものであり、この場合削除対象が絞られる理由はビューのSELECTになると思うのですが、実際どうなのでしょうか。

この投稿に対して返信しませんか?