現象
Oracle 12c案件(Oracle DB Enterprise 12.2.0.1.0)でデータのリストア手順を組むことになり、一旦Dropしたユーザーを再度Createして……というところで、実際のDBに用意されているユーザーのCREATE文をSQL Developerで出力したところこんなGrantがくっついてきました。
GRANT EXECUTE ON "SYS"."SYS_PLSQL_FAA5F685_2385_1" TO "XXXXX" WITH GRANT OPTION; GRANT EXECUTE ON "SYS"."SYS_PLSQL_D9B1149D_9_1" TO "XXXXX" WITH GRANT OPTION;
XXXXXの部分はユーザー名です。 実際、ユーザーを言ったんDROPしてから、上記のSQLを含むCREATE文(DROP前に取って置いたもの)を実行すると、この部分が原因でエラーが起きます。
消すとエラーは起きないのですが、問題は「消してもいいものなの?」という点。「SYS_PLSQL_文字羅列」みたいなオブジェクトは作っていないのですが、なんだろう?必要なものであれば除外する訳にもいかないし。
検索結果
ということで「oracle create user execute grant sys_plsql」で検索してみたところ、Stackoverflowのこんなやりとりが。
- 無効な一時オブジェクトが作られてのこってしまう不具合。
- Oracle 12c R2で修正。
ということでしょうか。消して良いのかな……。PL/SQLで作られたデータなどをクライアントに返す際に利用するオブジェクトが生成され、それのバージョン管理された内部名が文字の羅列+末尾に数値、みたいな名称。それは本来、作られては消え、と言う扱いになるところ、のこってしまうものがある?みたいな??
参考
テスト用の環境で、このオブジェクトへのGrantで起きるCreate文のエラーを確認しようとおもって新しくユーザーを作ったところ……謎Grantは付いてきませんでした。また、謎Grantが付いていたユーザーのCreate文、Dropして再実行してもGrant部分でエラーが起きませんでした(文字羅列の謎オブジェクトが実在している?)。ですが、前にやったときはエラーになっていた。
一体どういうことなんでしょうか……