助け合いフォーラム
Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26590
問題を開く
ユーザーAがCUSTOMERS表を所有しています。データベース管理者はユーザーBにユーザーAが所有するCUSTOMERS表のSELECT権限を付与しました。
ユーザーBが下記のようにCUSTOMERS表を参照できるようにシノニムを作成するための、実行者とSQL文の組合せとして正しいものはどれですか。
なお、ユーザーAにはCREATE SYNONYM権限が付与されています。
SELECT * FROM cust;
実行者:
1) データベース管理者 2) ユーザーA
SQL文:
a) CREATE SYNONYM cust FOR a.CUSTOMERS;
b) CREATE PUBLIC SYNONYM cust FOR a.CUSTOMERS;
c) CREATE PUBLIC SYNONYM cust FOR CUSTOMERS;
d) CREATE SYNONYM cust FOR CUSTOMERS;
ユーザーBが下記のようにCUSTOMERS表を参照できるようにシノニムを作成するための、実行者とSQL文の組合せとして正しいものはどれですか。
なお、ユーザーAにはCREATE SYNONYM権限が付与されています。
SELECT * FROM cust;
実行者:
1) データベース管理者 2) ユーザーA
SQL文:
a) CREATE SYNONYM cust FOR a.CUSTOMERS;
b) CREATE PUBLIC SYNONYM cust FOR a.CUSTOMERS;
c) CREATE PUBLIC SYNONYM cust FOR CUSTOMERS;
d) CREATE SYNONYM cust FOR CUSTOMERS;
正解
実行者:1) SQL文:b)
解説
ユーザーが使用できるシノニムは、自身のスキーマに作成されたプライベートシノニムまたはパブリックシノニムのどちらかです。
設問では、ユーザーBがシノニムを使用した問合せを行うので、ユーザーBのプライベートシノニムまたはパブリックシノニムとしてCUSTシノニムが作成されなければなりません。
以上より、
・実行者:1) SQL文:b)
が正解となります
その他の選択肢については次のとおりです。
・実行者:1) SQL文:a)
(データベース管理者が CREATE SYNONYM cust FOR a.CUSTOMERS; を実行)
PUBLICの指定がないためデータベース管理者のプライベートシノニムが作成されます。そのためユーザーBがこのシノニムを利用することはできません。
・実行者:2) SQL文:c)
(ユーザーAが CREATE PUBLIC SYNONYM cust FOR CUSTOMERS; を実行)
ユーザーAにCREATE PUBLIC SYNONYM権限は付与されていないため、パブリックシノニムを作成することはできません。
・実行者:2) SQL文:d)
(ユーザーAが CREATE SYNONYM cust FOR CUSTOMERS; を実行)
PUBLICの指定がないためユーザーAのプライベートシノニムが作成されます。そのためユーザーBがこのシノニムを利用することはできません。
設問では、ユーザーBがシノニムを使用した問合せを行うので、ユーザーBのプライベートシノニムまたはパブリックシノニムとしてCUSTシノニムが作成されなければなりません。
以上より、
・実行者:1) SQL文:b)
が正解となります
その他の選択肢については次のとおりです。
・実行者:1) SQL文:a)
(データベース管理者が CREATE SYNONYM cust FOR a.CUSTOMERS; を実行)
PUBLICの指定がないためデータベース管理者のプライベートシノニムが作成されます。そのためユーザーBがこのシノニムを利用することはできません。
・実行者:2) SQL文:c)
(ユーザーAが CREATE PUBLIC SYNONYM cust FOR CUSTOMERS; を実行)
ユーザーAにCREATE PUBLIC SYNONYM権限は付与されていないため、パブリックシノニムを作成することはできません。
・実行者:2) SQL文:d)
(ユーザーAが CREATE SYNONYM cust FOR CUSTOMERS; を実行)
PUBLICの指定がないためユーザーAのプライベートシノニムが作成されます。そのためユーザーBがこのシノニムを利用することはできません。
参考
シノニムはオブジェクトの別名を表すスキーマ・オブジェクト(データベースに格納されるオブジェクトで、一意に識別できるオブジェクトIDを持つ)です。表やビューなどのオブジェクトに別名を付けることで、オブジェクトの指定を簡単に行えるようになったり、スキーマ名を隠蔽してセキュリティを高めたりすることができます。
シノニムにはプライベートシノニムとパブリックシノニムの2種類のシノニムがあります。
プライベートシノニムはシノニムを作成したユーザーだけが使用できるシノニムであるのに対し、パブリックシノニムは全てのユーザーが使用できるシノニムです。
ただし、シノニムを使用するには、基となるオブジェクトに対する適切な権限が必要です。例えば、表のシノニムを使用して問合せを行う場合は、基になる表に対する参照権限が必要です。
プライベートシノニムを作成するにはCREATE SYNONYM権限、パブリックシノニムを作成するにはCREATE PUBLIC SYNONYM権限が必要になります。
CREATE [PUBLIC] SYNONYM シノニム名 FOR オブジェクト名;

プライベートシノニムはスキーマと紐付けられますが、パブリックシノニムは特定のスキーマと紐付けられていないため、プライベートシノニムとパブリックシノニムとで同名のシノニムを作成することができます。
プライベートシノニムとパブリックシノニムで同名のシノニムが存在する場合は、プライベートシノニムが優先されます。


シノニムにはプライベートシノニムとパブリックシノニムの2種類のシノニムがあります。
プライベートシノニムはシノニムを作成したユーザーだけが使用できるシノニムであるのに対し、パブリックシノニムは全てのユーザーが使用できるシノニムです。
ただし、シノニムを使用するには、基となるオブジェクトに対する適切な権限が必要です。例えば、表のシノニムを使用して問合せを行う場合は、基になる表に対する参照権限が必要です。
プライベートシノニムを作成するにはCREATE SYNONYM権限、パブリックシノニムを作成するにはCREATE PUBLIC SYNONYM権限が必要になります。
CREATE [PUBLIC] SYNONYM シノニム名 FOR オブジェクト名;

SQLを表示
CREATE SYNONYM dept FOR departments;
プライベートシノニムはスキーマと紐付けられますが、パブリックシノニムは特定のスキーマと紐付けられていないため、プライベートシノニムとパブリックシノニムとで同名のシノニムを作成することができます。
プライベートシノニムとパブリックシノニムで同名のシノニムが存在する場合は、プライベートシノニムが優先されます。

SQLを表示
CONNECT
CREATE PUBLIC SYNONYM dept FOR pingt.employees;
CREATE PUBLIC SYNONYM dept FOR pingt.employees;

SQLを表示
SELECT employee_id, employee_name FROM dept;
CREATE SYNONYM dept FOR departments;
SELECT * FROM dept;
CREATE SYNONYM dept FOR departments;
SELECT * FROM dept;
プライベートシノニムにアクセスできる権限について
j
junext25
投稿日 2025/07/19
黒本に「所有ユーザおよび、シノニムが指すオブジェクトにアクセスできるユーザが、このプライベートシノニムにアクセスできる」と記載があるのですが、この問題の場合「ユーザーBにユーザーAが所有するCUSTOMERS表のSELECT権限を付与」と記載があるので、「ユーザーAがCREATE SYNONYM cust FOR CUSTOMERS;」で作成した場合でもユーザBは「ユーザA.cust」で参照できないのでしょうか?
r
rink_rew
2025/07/22 14:04
実際に試してみましたが、あるユーザーが作成したプライベートシノニムを使用して、他のユーザーから対象の表にアクセスすることはできないようです。
SQL> GRANT CREATE SYNONYM TO User1;
権限付与が成功しました。
SQL> CONN user1/user1
接続されました。
SQL> SELECT * FROM TestTable01;
ID NAME
---------- --------------------------------------------------
1 AAA
SQL> CREATE SYNONYM Pri_tbl01A FOR TestTable01; <- User1がプライベートシノニム「Pri_tbl01A」を作成
シノニムが作成されました。
SQL> SELECT * FROM Pri_tbl01A;
ID NAME
---------- --------------------------------------------------
1 AAA
SQL> GRANT SELECT ON TestTable01 TO User2;
権限付与が成功しました。
SQL> CONN user2/user2
接続されました。
SQL> SELECT * FROM user1.TestTable01; <-User2が、User1のTestTable01への参照権限を持っていることを確認
ID NAME
---------- --------------------------------------------------
1 AAA
SQL> SELECT * from Pri_tbl01A; <-User1が作成したプライベートシノニム「Pri_tbl01A」でアクセスできない
SELECT * from Pri_tbl01A
*
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。
SQL> conn sys/sys as sysdba
接続されました。
SQL> CREATE PUBLIC SYNONYM Pub_tbl01A FOR User1.TestTable01; <-管理者でパブリックシノニム「Pub_tbl01A」を作成
シノニムが作成されました。
SQL> CONN user2/user2
接続されました。
SQL> SELECT * FROM Pub_tbl01A; <- 管理者が作成したパブリックシノニム「Pub_tbl01A」を使用して、User2は、User1のTestTable01にアクセスできる
ID NAME
---------- --------------------------------------------------
1 AAA
SQL>
追記で問題には「なお、ユーザーAにはCREATE SYNONYM権限が付与されています。」と記載されていますが、publicシノニムを作成するにはCREATE PUBLIC SYNONYM権限が必要ではないんでしょうか?
本設問では、データベース管理者がパブリックシノニムを作成する選択肢が正当ですので、ユーザーAが CREATE PUBLIC SYNONYM権限を持っていなくても影響はありません。
コメント
この投稿に対して返信しませんか?
j junext25
2025/07/19 20:16
追記で問題には「なお、ユーザーAにはCREATE SYNONYM権限が付与されています。」と記載されていますが、publicシノニムを作成するにはCREATE PUBLIC SYNONYM権限が必要ではないんでしょうか?