rink_rewさんの投稿一覧
私も気になってちょっと調べてみたのですが、実際に付与しようとすると、付与自体は成功するようです。
SQL> CREATE OR REPLACE VIEW emp_view AS
2 SELECT employee_id, employee_name, department_id
3 FROM employees;
ビューが作成されました。
SQL> GRANT REFERENCES ON emp_view TO testuser01;
権限付与が成功しました。
SQL>
手持ちのオラクルマスター教科書(黒本)見てみたのですが、Silver DBAのテキストとSilver SQLのテキストで、記載が異なってました。
※Silver SQLの方は「主なオブジェクト権限」の一覧に、「ビュー」のオブジェクト権限として「REFERENCES」の記載があるが、Silver DBAの方は記載がない。
公式マニュアルみると、「表18-2 オブジェクト権限(操作対象のデータベース・オブジェクト別)」にビュー権限として「REFERENCES」入っていて、付与できそうに見える。
https://docs.oracle.com/cd/F19136_01/sqlrf/GRANT.html
実試験でこういう問題が出題されると、回答に困りますね...。
2は、USINGの結合列としてdepartment_idが指定されていて、結合列に別名がついている(SELECT d.department_id ~~~~の d.department_id の部分)という話ですかね。
日本語の問題とも言えるかもしれませんが、解説の「USING句を指定した結合では、結合列に表接頭辞を使用できません。」はどちらのケースも説明できている、と言えないこともないかなと思いました。
SQL> SELECT d.department_id, e.employee_name FROM departments d JOIN employees e USING(department_id);
SELECT d.department_id, e.employee_name FROM departments d JOIN employees e USING(department_id)
*
行1でエラーが発生しました。:
ORA-25154: USING句の列の部分には修飾子を持てません。
SQL> SELECT department_id, e.employee_name FROM departments d JOIN employees e USING(department_id);
DEPARTMENT_ID EMPLOYEE_NAME
------------- ------------------------------
1 山田二郎
2 佐藤昭夫
3 山口洋子
4 田中浩介
5 加藤昭彦
1 佐々木明子
1 菊池浩二
1 中山大輔
2 星野健一
3 斎藤京子
4 吉田亜希
DEPARTMENT_ID EMPLOYEE_NAME
------------- ------------------------------
5 阿部伊吹
1 米村真司
2 伊藤佳奈
3 橋本淳
4 井上悦子
5 渡辺和也
1 塚本孝
1 野口圭子
1 内田雄介
1 高田明
1 坂本真
22行が選択されました。
SQL>
実際の試験でどのように出題される可能性があるかまではわかりませんが、解説のとおり「current_time」は「トランザクションの開始時刻」の方が正確な説明ですよね。
ちなみに、「時刻」なのか「日時」なのか、「日時」には「時刻」も含まれるではないか、という点については、こういう試験では「より適切な選択肢」が正当となることが多い気がするので、問題文が「現在の時刻を取得する」なので、「current_timestamp」と「current_time」が選択肢にあって正答を一つ選ぶ問題であれば「current_time」の方が正答になると考えておいた方が無難かなとは思います。
この辺は過去にもフォーラムで議論があったみたいです。
https://mondai.ping-t.com/g/posts/1444
一応空白は入ってるように見えますが、解説に載っている出力結果のキャプチャの通り、本来はもっと空白が長い(月の単語の中で一番長いSeptemberに合わせているらしい)はずではありますね。
ただ、FMをつけた場合は、空白が全くなくなり、月の単語とカンマが隣接するので、正当の選択肢にFMがないこと自体は正しいと言える思います。
SQL> SELECT TO_CHAR(SYSDATE, 'Ddspth "of" Month, YYYY') FROM dual;
TO_CHAR(SYSDATE,'DDSPTH"OF"MONTH,YYYY')
------------------------------------------------------------
Twenty-Third of March , 2025
SQL> SELECT TO_CHAR(SYSDATE, 'Ddspth "of" FMMonth, YYYY') FROM dual;
TO_CHAR(SYSDATE,'DDSPTH"OF"FMMONTH,YYYY')
------------------------------------------------------------
Twenty-Third of March, 2025
SQL>
「現在、コミットしていないトランザクションがない」は、その後に示されているDELETE文が、トランザクションの途中で実行される訳ではないという前提を示しているだけです。SQL Plusなどで新規に接続した直後をイメージすると良いと思います。
その上で、解説にもある通りDELETE文はDMLであり、DELETE文の実行で新しいトランザクションが開始され、コミットされるまではROLLBACKが可能です。