※当サイトの記事には、広告・プロモーションが含まれます。

Oracle DatabaseのSequenceがどのテーブルのカラムで使われてるか知りたかったけど...

nazology.net

血液サラサラを目指すしかないんかな...

Oracle DatabaseのSequenceとは

Oracle Database 11gのドキュメントによりますと、

docs.oracle.com

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」って何なのか?

docs.oracle.com

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」の言葉の定義はと言うと、

docs.oracle.com

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」を関連付けて情報を取得することができないんだそうな...

forums.oracle.com

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.

https://forums.oracle.com/ords/apexds/post/how-the-find-the-sequence-and-its-associated-tables-for-a-p-4833

⇧ う~む、Oracle Databaseいろいろと破綻している気がする...

結局のところ、Excelとかで、どの「Sequence」がどの「Table」で使われてるかとかを管理する必要があるってことかね...

仮に、「Sequence」の数が1000とかあったら、地獄ですな...

なんか、

stackoverflow.com

⇧「Trigger」を作っているケースであれば、「Trigger」を元に、どの「Sequence」がどの「Table」で使われてるかを確認することができるっぽいようですかね。

で、「Trigger」も作ってないし、Oracle Databaseのバージョンが12c以前って場合は、諦めるしかないっぽい...

「Sequence」の名前が「Table」の名前に近しいものであれば、推測できそうではあるけど、100%正しいとは言えない...

そして、悲報は続く。

docs.oracle.com

Database Object Naming Rules

The following list of rules applies to both quoted and nonquoted identifiers unless otherwise indicated:

  1. 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.

https://docs.oracle.com/database/121/SQLRF/sql_elements008.htm#:~:text=Names%20must%20be%20from%201,as%20long%20as%20128%20bytes.

⇧ まさかの文字数制限...

Excelのシート名といい、文字数制限するにしても、もう少し余裕をもった文字数にできなかったのだろうか...

というわけで、Oracle Databaseで「Sequence」を使ってる場合は、SQL文でどの「Sequence」がどの「Table」で使われてるかを確認することを想定した作りになってないっぽいので、ExcelとかGoogleスプレッドシートとかで「Sequence」がどこで使われてるのかを管理しておく必要があるってことですかね...

苦肉の策だけども、

docs.oracle.com

docs.oracle.com

⇧ 上記のOracle Databaseが用意してるobjectから、「SEQUENCE_NAME」と「TABLE_NAME」の一覧を取得して、名前が似てるものを突き合わせて確認する感じになるんかな...

ちなみに、Oracle Database 19cで、

SELECT distinct sequence_owner FROM ALL_SEQUENCES;

⇧ を実行してみて、自分で作成したスキーマを除くと、

  1. SYS
  2. SYSTEM
  3. DBSNMP
  4. CTXSYS
  5. OJVMSYS
  6. DVSYS
  7. GSMADMIN_INTERNAL
  8. ORDDATA
  9. OLAPSYS
  10. MDSYS
  11. LBACSYS
  12. XDB
  13. WMSYS

⇧ の数だけ、スキーマがあり、

SELECT distinct owner FROM ALL_TABLES;
  1. SYS
  2. SYSTEM
  3. DBSNMP
  4. APPQOSSYS
  5. DBSFWUSER
  6. CTXSYS
  7. OJVMSYS
  8. DVSYS
  9. GSMADMIN_INTERNAL
  10. ORDDATA
  11. MDSYS
  12. OLAPSYS
  13. LBACSYS
  14. OUTLN
  15. XDB
  16. WMSYS
  17. ORDSYS

⇧ の数だけスキーマがありました、「sequence_owner」「owner」の値が「schema」と言えるかどうかハッキリしないけど、自分で作成したスキーマが含まれてたので、スキーマと言って良いんかな?

stackoverflowによると、

stackoverflow.com

スキーマの全量を取得できるらしいので、取得してみます。

SELECT distinct username FROM DBA_USERS;

⇧ を実行した結果から、自分の作成したスキーマを除いたものが以下。

  1. SYS
  2. SYSTEM
  3. XS$NULL
  4. DBSNMP
  5. APPQOSSYS
  6. GSMCATUSER
  7. MDDATA
  8. DBSFWUSER
  9. GGSYS
  10. ANONYMOUS
  11. SYSBACKUP
  12. REMOTE_SCHEDULER_AGENT
  13. PDBADMIN
  14. GSMUSER
  15. CTXSYS
  16. SYSRAC
  17. DVSYS
  18. DVF
  19. OJVMSYS
  20. SI_INFORMTN_SCHEMA
  21. AUDSYS
  22. GSMADMIN_INTERNAL
  23. DIP
  24. ORDPLUGINS
  25. LBACSYS
  26. MDSYS
  27. OLAPSYS
  28. SYSKM
  29. ORDDATA
  30. OUTLN
  31. ORACLE_OCM
  32. SYS$UMF
  33. XDB
  34. WMSYS
  35. SYSDG
  36. ORDSYS

スキーマの全量らしい。

こやつらは、WHERE句で除外するようにした方が良さそうですかね。

「SEQUENCE_NAME」と「TABLE_NAME」の一覧を取得して、名前が似てるものを突き合わせる方法は、「Sequence」の命名規則に依存してるから、テーブルの名前と全然関係ない「Sequence」の名前になってしまっていると、手の施しようがないけども...

他のデータベースとかだと、こんな不便なことは無いのかな?

毎度モヤモヤ感が半端ない...

今回はこのへんで。