何を今さら言っているんだ…と思われる方も多いタイトルかと思いますが、今まで知らなかったので(ORACLE MASTERを勉強していた頃は知っていたのかも…)、ちょっと纏めてみることにしました。
1.シノニムとは
シノニムは表やビューなどに付与できる別名で、これを使用することで他のユーザが所有しているテーブルを、あたかも自ユーザのテーブルであるかの様にSQLを記述できるようになります。言い換えると、テーブル等のオブジェクト所有ユーザを意識しないSQLを記述できるようになります。以下がその例です。
シノニムなし SELECT col1, col2 FROM objusr.tab01; シノニムあり SELECT col1, col2 FROM tab01;
2.シノニム経由でTRUNCATEしてみる
Oracle19c環境でシノニム経由のTRUNCATEを実行してみると、下記の様にORA-00942エラーが発生しました。
※他ユーザが所有するテーブルをTRUNCATEするのに必要なDROP ANY TABLE権限が付与されたユーザで実行しています。
SQL> TRUNCATE TABLE tab01; TRUNCATE TABLE tab01 * 行1でエラーが発生しました。: ORA-00942: 表またはビューが存在しません。
TRUNCATEはエラーになりましたが、SELECT文ではエラーにならなかったので、シノニムが誤っているわけではないと言えます。
SQL> SELECT COUNT(*) FROM tab01; COUNT(*) ---------- 10000000
これらの実機確認結果から、シノニム経由でTRUNCATEは実行できないということが言えるかと思います。
3.公式ドキュメントを確認してみる
テーブルをTRUNCATEする際はシノニムが使用できないことが記載されている公式ドキュメントがないか探したところ、マニュアルに記載されていました。
SQL言語リファレンス - CREATE SYNONYM
シノニムを参照できるDML文は、SELECT、INSERT、UPDATE、DELETE、FLASHBACK TABLE、EXPLAIN PLAN、LOCK TABLE、MERGEおよびCALLです。
シノニムを参照できるDDL文は、AUDIT、NOAUDIT、GRANT、REVOKEおよびCOMMENTです。
上記マニュアルの記載より、シノニムを参照できるDDL文にTRUNCATEが含まれていないことから、TRUNCATEでシノニムは使用できないことがわかりました。
4.さいごに
今回の話は非常に初歩的なことなのだとは思いますが、そういったことでも知らないことはあるのだと思い知らされた内容でした。
次の記事:表パーティションに対する操作で索引がどうなるか調べてみた ~ その1 ~