4

PowerBuilder プログラムを維持しようとしていますが、コードを書いた前のプログラマーにアクセスできません。データウィンドウを変更したところ、選択した列名にテーブル所有者 (dbo) が含まれていないソース コードが生成されました。ただし、WHERE 句に dbo が含まれています。下記参照。

(古いソース コードでは、selection と where のすべての場所に dbo.FieldAuxs が表示されます。)

retrieve="PBSELECT( VERSION(400) TABLE(NAME=~"FieldAuxs~" ) 
COLUMN(NAME=~"FieldAuxs.id~") 
COLUMN(NAME=~"FieldAuxs.clientid~") 
COLUMN(NAME=~"FieldAuxs.status~") 
COLUMN(NAME=~"FieldAuxs.historyear~") 
WHERE(    EXP1 =~"dbo.FieldAuxs.id~"   OP =~"=~"    EXP2 =~":al_id~" ) ) ARG(NAME = ~"al_id~" TYPE = number) " update="FieldAuxs" updatewhere=1 updatekeyinplace=no arguments=(("al_id", number)) )

これにより、エラーが発生します:列プレフィックス dbo.FieldAuxs が、クエリで使用されるテーブル名またはエイリアス名と一致しません...

私のデータベース プロファイルは、私を (dbo ではなく) 私として PowerBuilder 開発環境にログインさせています。それが私のやりたいことだと信じています。

SQLCA.DBParm を SQLQualifiers=1 に設定する方法について読みましたが、データベース プロファイルのセットアップに DBParms 入力領域がありません。12.5 より前のバージョンでは、DBParm 値をボックスに直接入力できたようです。しかし、12.5 では、DBParm の値を設定するチェックボックスとドロップダウンしかありません。また、SQLQualifiers の値を設定することにつながる選択肢はありません。ドキュメントによると: SQLQualifiers=1 --SQL ステートメントの所有者名で識別子を修飾します。

データウィンドウが、選択ではなく WHERE 句でのみ列名を完全に修飾するソース コードを自動生成するように、何かを正しく設定してはなりません。

アイデアは大歓迎です!

4

3 に答える 3

2

あなたが説明する問題は一般的なものです。

典型的な原因 - 開発者が開発モードで異なるデータベース ユーザー ID を使用している

「スキーマ所有者」として (開発モードで) データベースにログインする 1 人の開発者と、標準ユーザー (例: john_doe) として (開発モードで) データベースにログインする別の開発者。

ユーザーが通常の (スキーマ所有者ではない) ユーザー ID でアプリケーションを実行すると、データウィンドウが失敗するため、 開発者は一般に、特に複数スキーマ データベースでデータウィンドウを開発または作成するときに、スキーマ所有者としてログインすることを避ける必要があります。

これは概念的には単純ですが、開発者は開発中のスキーマ/テーブル所有者にアクセスして、テーブルの作成や列の変更などに使用することがよくありますが、通常のユーザー ID 接続に戻すのを忘れているため、常に発生します。データウィンドウを開発します。

PowerBuilder が識別子を修飾する場合(PB12.5 ヘルプより)

テーブル所有者の名前がデータベースにログインしているユーザの名前と同じである場合、PowerBuilder は、生成する SQL 文で識別子を所有者名で修飾しません。そのため、PowerBuilder で所有者名を修飾する必要がある場合は、テーブルを所有していないユーザーでログインする必要があります。

SQLQualifiers データベース パラメーターの使用(PB12.5 ヘルプから)

このパラメーターは、ほとんどのデータベースでは機能しません。PB 12.5 のドキュメントによると、SQLQualifiers はDIR Sybase DirectConnectのみに固有です。

その他のソリューションと注意事項

データウィンドウの SQL を Syntax に変換することはできますが、絶対に必要でない限り、これを避けるようにしています。構文に変換すべきではない理由は、データウィンドウに組み込まれた魔法の一部が失われるためです。2 つ以上のバックエンド データベースをサポートするアプリケーションで作業している場合、構文に変換するには、DBMS ごとに個別のデータウィンドウのセットを作成する必要があります。たとえば、MS SQL Server と比較して Oracle の左外部結合構文を考えてみましょう。構文でコーディングされている場合、データウィンドウは 1 つのデータベースで機能しますが、グラフィック モードのままの場合、PowerBuilder は、使用されている DBMS に基づいて適切な左外部結合構文を自動的に使用します。元の質問の範囲を超える構文に変換するときに無効にする他の多くの利点 (魔法) があります。

于 2012-11-12T09:35:26.933 に答える
1

最短の解決策は、データウィンドウの SQL ペインタで、[デザイン] メニューの [構文に変換] に移動し、手動で SQL 構文を自分で編集することです。(率直に言って、グラフィカル ペインタはかなり制限的であり、助けになるどころか速度が低下します。これは通常、データウィンドウを作成する最初のステップの 1 つです。)

関連するデータベースのデータベース所有者 (dbo)としてアカウントを割り当てるなど、DBMS に大きく依存していると私が想像しているヒントや微調整がおそらくあります (DBMS についてはまだ言及されていません) 。現在の閉塞を最速で通過します。

幸運を、

テリー。

于 2012-11-06T14:51:42.507 に答える
0

最近 Powerbuilder 10.5 から 12.5 にアップグレードしたことを前にお伝えしませんでした。変換後、データ ウィンドウが変更されたのはこれが初めてです。

今日、私はこのデータ ウィンドウの SQL Painter を注意深く見て、[WHERE] タブをクリックしました。列の下に、dbo.FieldAuxs.id (WHERE 句に表示される完全修飾名) と表示されます。以前は、このウィジェットを選択するまで矢印が表示されないため、これがドロップダウンであることを認識していませんでした。ドロップして選択肢を確認したところ、完全に修飾されたものはありませんでした。つまり、テーブル所有者 dbo のプレフィックスが付いたものはありませんでした)。FieldAuxs.id を選択し、データ ウィンドウを保存しました。現在、自動生成された select ステートメントには一貫して dbo が含まれていません。プレフィックスとして。

dbo.FieldAuxs.id は、元プログラマーがデータベース プロファイルで完全修飾列名を使用することを選択したときのバージョン 10.5 のアーティファクトであるかのように見えます。

于 2012-11-06T17:56:52.533 に答える