⇧ 血液サラサラを目指すしかないんかな...
Oracle DatabaseのSequenceとは
Oracle Database 11gのドキュメントによりますと、
Sequences are database objects from which multiple users can generate unique integers. The sequence generator generates sequential numbers, which can help to generate unique primary keys automatically, and to coordinate keys across multiple rows or tables.
https://docs.oracle.com/cd/E18283_01/server.112/e17120/views002.htm
⇧「database objects」ということらしいのですが、一意な主キーを自動的に生成して、複数の行やテーブル間でキーを調整する、という分かりにくい説明なんだけども、そもそも「database objects」って何なのか?
Database Objects
Oracle Database recognizes objects that are associated with a particular schema and objects that are not associated with any particular schema, as described in the sections that follow.
https://docs.oracle.com/database/121/SQLRF/sql_elements007.htm#SQLRF20003
⇧上記の説明によると、
- Database Objects
- objects that are associated with a particular schema
- objects that are not associated with any particular schema
の2つと言っているのだけど、そもそも「Oracle Database」における「objects」の言葉の定義はと言うと、
About Oracle Objects
Oracle object types are user-defined types that make it possible to model real-world entities, such as customers and purchase orders, as objects in the database.
https://docs.oracle.com/database/121/ADOBJ/adobjint.htm#ADOBJ00101
⇧「object types」が「objects」ということになるらしい。
そして、
New object types can be created from any built-in database types and any previously created object types, object references, and collection types. Object types can work with complex data, such as images, audio, and video. Oracle Database stores metadata for user-defined types in a schema that is available to SQL, PL/SQL, Java, and other languages.
https://docs.oracle.com/database/121/ADOBJ/adobjint.htm#ADOBJ00101
⇧「object types」の全量については特に説明せずという...
相変わらず、ドキュメントがカオスなOracleさん、流石です...
とりあえず、TableとかSequenceは、Oracle Objectsの1つということになるんですかね?
Oracle DatabaseのSequenceがどのテーブルのカラムで使われてるか知りたかったけど...
で、話を「Sequence」に戻すと、「Sequence」ってのは、『which can help to generate unique primary keys automatically, and to coordinate keys across multiple rows or tables.』って説明にあるように「Table」とかと密接に関係してきそうではあるのですが、何と驚くことにバージョン12c以前だと、「Sequence」と「Table」を関連付けて情報を取得することができないんだそうな...
Pre 12c, there is NO association between a Sequence and a Table. A single Sequence may be used by more than one Table.
You have to review all your application code to identify which column in which table is populated by values from the sequence.
⇧ う~む、Oracle Databaseいろいろと破綻している気がする...
結局のところ、Excelとかで、どの「Sequence」がどの「Table」で使われてるかとかを管理する必要があるってことかね...
仮に、「Sequence」の数が1000とかあったら、地獄ですな...
なんか、
⇧「Trigger」を作っているケースであれば、「Trigger」を元に、どの「Sequence」がどの「Table」で使われてるかを確認することができるっぽいようですかね。
で、「Trigger」も作ってないし、Oracle Databaseのバージョンが12c以前って場合は、諦めるしかないっぽい...
「Sequence」の名前が「Table」の名前に近しいものであれば、推測できそうではあるけど、100%正しいとは言えない...
そして、悲報は続く。
Database Object Naming Rules
The following list of rules applies to both quoted and nonquoted identifiers unless otherwise indicated:
-
Names must be from 1 to 30 bytes long with these exceptions:
-
Names of databases are limited to 8 bytes.
-
Names of database links can be as long as 128 bytes.
-
⇧ まさかの文字数制限...
Excelのシート名といい、文字数制限するにしても、もう少し余裕をもった文字数にできなかったのだろうか...
というわけで、Oracle Databaseで「Sequence」を使ってる場合は、SQL文でどの「Sequence」がどの「Table」で使われてるかを確認することを想定した作りになってないっぽいので、ExcelとかGoogleスプレッドシートとかで「Sequence」がどこで使われてるのかを管理しておく必要があるってことですかね...
苦肉の策だけども、
⇧ 上記のOracle Databaseが用意してるobjectから、「SEQUENCE_NAME」と「TABLE_NAME」の一覧を取得して、名前が似てるものを突き合わせて確認する感じになるんかな...
ちなみに、Oracle Database 19cで、
SELECT distinct sequence_owner FROM ALL_SEQUENCES;
⇧ を実行してみて、自分で作成したスキーマを除くと、
- SYS
- SYSTEM
- DBSNMP
- CTXSYS
- OJVMSYS
- DVSYS
- GSMADMIN_INTERNAL
- ORDDATA
- OLAPSYS
- MDSYS
- LBACSYS
- XDB
- WMSYS
⇧ の数だけ、スキーマがあり、
SELECT distinct owner FROM ALL_TABLES;
- SYS
- SYSTEM
- DBSNMP
- APPQOSSYS
- DBSFWUSER
- CTXSYS
- OJVMSYS
- DVSYS
- GSMADMIN_INTERNAL
- ORDDATA
- MDSYS
- OLAPSYS
- LBACSYS
- OUTLN
- XDB
- WMSYS
- ORDSYS
⇧ の数だけスキーマがありました、「sequence_owner」「owner」の値が「schema」と言えるかどうかハッキリしないけど、自分で作成したスキーマが含まれてたので、スキーマと言って良いんかな?
stackoverflowによると、
⇧ スキーマの全量を取得できるらしいので、取得してみます。
SELECT distinct username FROM DBA_USERS;
⇧ を実行した結果から、自分の作成したスキーマを除いたものが以下。
- SYS
- SYSTEM
- XS$NULL
- DBSNMP
- APPQOSSYS
- GSMCATUSER
- MDDATA
- DBSFWUSER
- GGSYS
- ANONYMOUS
- SYSBACKUP
- REMOTE_SCHEDULER_AGENT
- PDBADMIN
- GSMUSER
- CTXSYS
- SYSRAC
- DVSYS
- DVF
- OJVMSYS
- SI_INFORMTN_SCHEMA
- AUDSYS
- GSMADMIN_INTERNAL
- DIP
- ORDPLUGINS
- LBACSYS
- MDSYS
- OLAPSYS
- SYSKM
- ORDDATA
- OUTLN
- ORACLE_OCM
- SYS$UMF
- XDB
- WMSYS
- SYSDG
- ORDSYS
⇧ スキーマの全量らしい。
こやつらは、WHERE句で除外するようにした方が良さそうですかね。
「SEQUENCE_NAME」と「TABLE_NAME」の一覧を取得して、名前が似てるものを突き合わせる方法は、「Sequence」の命名規則に依存してるから、テーブルの名前と全然関係ない「Sequence」の名前になってしまっていると、手の施しようがないけども...
他のデータベースとかだと、こんな不便なことは無いのかな?
毎度モヤモヤ感が半端ない...
今回はこのへんで。