■SI ObjectBrowser掲示板

ユーザの皆様、開発者、サポート担当者の交流のための掲示板です!discussion
ユーザーのみなさま同士で教え合ったり、アドバイスしたりする暖かい交流の場にしたいと思っていますので、相互協力をよろしくお願いします。なお、過去に同じようなQ&Aがあるケースも多いので、投稿前にキーワード検索してみてください。

※◆のカラーは投稿の対象となる製品に対応しています。【…OB …OBER …全般 ◇…その他】
※ライセンスに関するお問合せにつきましては、お問い合わせページよりご連絡いただきますようお願いいたします。
※誹謗中傷や公序良俗に反する書き込みはご遠慮ください。運営側の判断によりメッセージを削除する場合があります。
※環境依存や技術的調査が必要な問題については掲示板上ではお答えしかねます。ご了承ください。




トリガー編集画面で修正・作成するとテーブル名にスキーマが付く 2023/12/20 11:58:12
デコピン
OB Ver.21.2.15を利用しています。
トリガーを編集画面で修正後、「作成」ボタンでコンパイルすると
必ずテーブル名の前にスキーマー名が付いてしまいます。
「ON テーブル名」→「ON スキーマー名.テーブル名」

確認方法として、
1.Oracle Developerにて、トリガーのソースを開き
  「テーブル名」の前に「スキーマー名」が無いことを確認
2.ObjectBrowserでトリガーを開き修正後「作成」ボタン押下
3.再度、Oracle Developerにてトリガーのソースを開くと
  「テーブル名」の前にスキーマー名が付いている
   ON スキーマー名.テーブル名

上記状態で、スキーマーをエクスポートして、別のスキーマーにインポートすると
上記トリガーのテーブルはエクスポートしたテーブルを見に行ってしまう状態が発生するので
非常に危険な状態になります。

対応としては、「トリガー画面」ではなく「SQL実行」で
トリガーのSQLをコンパイルすることで上記の状況を回避しています。

一度ご確認をお願い致します。

以上
元の文章を引用して返信

Re: トリガー編集画面で修正・作成するとテーブル名にスキーマが付く 2023/12/21 16:17:19
OBサポート
OBサポートです。

■トリガー画面の挙動について
SI Object Browserのトリガー画面では、
対象とするテーブルを「定義情報」タブの「起動条件」の項目にて指定いただく挙動となります。

作成されるスキーマは、「起動条件」欄にて指定する
・スキーマ
・テーブル
の項目に紐づいて作成されるため、

・スキーマ未指定の場合
トリガー作成時に、「スキーマ」欄を空とした場合には、
現在接続しているスキーマ(ユーザー)内に、対象テーブルが存在してる場合には、
現在接続しているスキーマ名がそのまま反映されます。
存在しない場合には作成時にエラーとなります。

・スキーマを明示的に指定する場合
意図したスキーマ内のテーブルに対してトリガーを作成する場合には、
「スキーマ」欄に明示的にスキーマを設定する必要がございます。

上記動作のため、
トリガー画面上にてテーブルのスキーマを空の状態のまま作成することができません。

本件、大変ご不便おかけしてしまい、誠に申し訳ありません。
何卒よろしくお願い申し上げます。
元の文章を引用して返信

Re: トリガー編集画面で修正・作成するとテーブル名にスキーマが付く 2023/12/22 09:35:11
デコピン
「OBサポート」様、ご回答ありがとうございます。

トリガーに限らず、ビューやプロシージャなどでも
「接続スキーマ」と異なるテーブルを参照する場合は、
テーブル名の前に「スキーマ名」を指定します。

逆に「接続スキーマ」と同じ場合は、あえてスキーマ名を記述していません。

今回のトリガーの起動テーブルに「スキーマ名」が必ず付くと、
「エクスポート」して、「他のスキーマにインポート」した場合、

トリガー以外は、テーブル名の前にスキーマ名が付いていないので
インポートされたスキーマ内のテーブルが参照されます。

「Object Browser」で編集したトリガーについては、
トリガー起動テーブル名の前に必ず「スキーマ名」が付いてしまうので、
エクスポート元の「スキーマ」の当該テーブルがトリガー起動テーブルになってしまいます。

弊社で良く行う作業として、
「本番用のスキーマ」をエクスポートして、
「テスト用のスキーマ」にインポートして検証等を行います。

何も意識せず、インポート後にそのまま検証作業に入ってしまうと
「本番用のテーブル」に反応して、テスト用のスキーマテーブルが更新されるという
事象が発生してしまいます。

特に上記のことを意識していないと、データが壊れていきます。

従って、弊社ではインポート後に必ず「トリガー一覧」で
「起動元のテーブルスキーマ」を確認して、
異なっているスキーマが無いかを確認、修正しています。

多分、「Object Browser」でトリガーを修正する際には、
スキーマが固定されることは意識していないと思いますので、
何か対応された方が宜しいかと思います。

以上です。
元の文章を引用して返信

Re: トリガー編集画面で修正・作成するとテーブル名にスキーマが付く 2023/12/22 16:48:11
デコピン
追伸です。

運用上、「ログインユーザー」は「スキーマ名」と
同一ユーザで作業を行っています。

「スキーマ名」と異なる「開発用ユーザー」を作成・権限付与されてる場合は
すべてスキーマ名が必要になりますね。
元の文章を引用して返信

Re: トリガー編集画面で修正・作成するとテーブル名にスキーマが付く 2023/12/25 11:35:35
OBサポート
OBサポートです。
ご回答が大変遅くなってしまい、誠に申し訳ありません。

スキーマ名が明示指定されてしまう際のリスクについて、承知いたしました。
本件、製品動作により大変ご不便ご迷惑をおかけしてしまい、誠に申し訳ありません。

■現状の製品動作について
前述の通り、現状のSI Object Browserの動作上
作成したスキーマ名に紐づくテーブルを対象にトリガーが作成される動作となりますため、
エクスポート・インポート時の影響が考慮されていないものとなります。

〇補足事項
トリガー画面上でスキーマを未指定で作成した直後は、
SQL*Plusなどの別ツールにてスキーマ未指定にて作成した状態と同じにDDLとなりますが、
その後の再表示時には未指定であったスキーマがALL_TRIGGERSビューを参照し自動で補完されるため、
再コンパイルを行うとスキーマが明示指定されるような動作であることを確認しております。
※都度スキーマ欄を空として作成いただく際には、
 トリガー画面のソースタブ上では自スキーマが指定されておりますが、
 Oracle Database内部のメタ情報上(ALL_SOURCEビュー上)では未指定として扱われます。

■回避策と今後の対応について
スキーマが明示指定されたオブジェクトに関しましては、Oracleのメタ情報上でもスキーマが記述されているため、
この状態でexp/impを実行すると事象の回避が行えません。

上述したような、スキーマ未指定によるトリガーの再作成を行うか、
スクリプト出力機能などによって出力されるトリガーのDDLを加工して適用いただく、
もしくはインポート後に適宜スキーマの切り替えをお願いできますでしょうか。

本動作に関してましては、今後のバージョンにてスキーマの指定未指定などの調整が行えるように
開発側に連携の上で検討させていただきます。

本件、大変ご不便ご迷惑をおかけしてしまい、誠に申し訳ありません。
何卒よろしくお願い申し上げます。
元の文章を引用して返信