助け合いフォーラム
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ビューに関する説明として、正しいものはどれですか。

次の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であるデータのみ更新することができます。
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 制約名]];

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

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

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

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

なお、CREATE VIEW文ではNOFORCEがデフォルトとなりますので、FORCE、NOFORCEどちらも指定しない場合は、実表がある場合のみビューを作成することができます。
[WITH CHECK OPTION]
ビューの作成時、WITH CHECK OPTIONオプションを指定すると、ビューを通じて実表のデータを操作する場合に、ビューの定義時に指定したWHERE句の条件を満たしていないデータの追加や更新ができなくなります。

CREATE VIEW文でビューを作成する場合は、次の点に注意が必要です。
・副問合せのSELECT句に計算式や関数を指定する場合は、CREATE VIEW文で別名を指定するか、SELECT句の計算式や関数に列別名を指定する

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

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

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;
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;
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 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;
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;
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;
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になると思うのですが、実際どうなのでしょうか。
この投稿に対して返信しませんか?