2016-08-25 3 views
1

最近、Advantage Database Serverをバックエンドとして使用するシステムのサポートを引き継いだ。いくつかの背景のために、私は長年のデータベース経験を持っていますが、今までADSを使用したことはありませんでしたので、私の質問はこの特定のDBMSに標準パターンを実装する方法に関するものです。このようにID列を管理し、以前に開発されたストアドプロシージャありますAdvantage Database Serverで一意の代理キーを実装する

@ID = (SELECT ISNULL(MAX(ID), 0) FROM ExampleTable); 
@ID = @ID + 1; 

INSERT INTO Example_Table (ID, OtherStuff) 
VALUES (@ID, 'Things'); 

--Do some other stuff. 

UPDATE ExampleTable 
SET AnotherColumn = 'FOO' 
WHERE ID = @ID; 

は私の問題は、私は今、並行して、このストアドプロシージャを複数回実行する必要があるということです。あなたが想像することができるように、私がこれをするとき、同じID値が何度もつかんでいます。

私が必要とするのは、同じ瞬間にストアドプロシージャを複数回実行しても一意であることが確実な一意の値を一貫して作成する方法です。 SQL Serverのでは、私はIDと呼ばれるIDENTITY列を作成し、次の行うことができます:

INSERT INTO ExampleTable (OtherStuff) 
VALUES ('Things'); 

SET @ID = SCOPE_IDENTITY(); 

ADSを似たようだautoincを持っていますが、私は何かが決定的に新規の値を返す方法を私に言って見つけることができません私が100%保証することができる方法で作成された価値は、同時使用では正しいでしょう。 ADS Developer's Guideは実際にautoincを使用して私に警告し、オンラインヘルプファイルは、最後に生成されたautoinc IDを取得するような機能を提供します(これは私が望むものではありません - 前のステートメントで作成したものすべてのセッションで作成されます)。また、ヘルプファイルには、並行処理が必要な状況で正しく機能しない可能性がある警告が記載されています。

これをADSに実装するにはどうすればよいですか? autoincを使用する必要がありますか、私が気付いていない他の組み込みメソッドを使用するか、開発者用ガイドの中で真に必要な作業を行い、最初にテーブルに挿入しようとする前に独自の識別子を生成しますか? autoincを使用する必要がある場合、テーブルに挿入されたばかりの値を取得するにはどうすればよいですか?

答えて

2

LastAutoInc(STATEMENT)autoincを使用します。 documentationから

(Advantageの下SQL->サポートされているSQL Grammar->サポートされているスカラーFunctions->その他):

LASTAUTOINC(CONNECTION | STATEMENT)

から最後に使用AUTOINC値を返します。挿入または追加する。 CONNECTIONを指定すると、接続全体の最後に使用された値が返されます。 STATEMENTを指定すると、現在のSQL文の最後に使用された値が戻されます。 autoinc値がまだ更新されていない場合、NULL値が返されます。

メモ:autoincフィールドを持つテーブルで動作するトリガは、最後のautoinc値に影響することがあります。

:SQLスクリプトトリガは、独自のSQL文で実行されます。したがって、SQLスクリプト・トリガー内でLASTAUTOINC(STATEMENT)を呼び出すと、トリガーの起動に使用された元のSQL文ではなく、トリガーのSQL文で使用されたlastautoinc値が戻されます。最後の元のSQLステートメントのlastautoinc値を取得するには、代わりにLASTAUTOINC(CONNECTION)を使用します。

例:システムからSELECT LASTAUTOINC(STATEMENT)を選択します。Iota

+0

迅速な対応のおかげで非常に多くの!私はautoincとLastAutoIncに関する情報が古くなったと思う。 LastAutoIncの使用方法については、CONNECTIONとSTATEMENTを使用していましたが、並行性の問題が解決するかどうかについての情報はありませんでした。 LastAutoInc(STATEMENT)はちょうど私が後にしているもののように聞こえるようになりました。 –

0

別の方法として、GUIDを使用する方法があります。

(これは、と言ったときに既にわかっているかもしれませんが、開発者用ガイドの示唆するところで真に必要なことですか?また、独自の識別子を生成してから - もしそうなら、それでもなおこの情報は他の人には役立つかもしれません:))

GUIDを代理キーとして使用すると、アプリケーションまたはデータベースは、a guarantee of no clashes

利点12は、内蔵されたGUIDデータ型のサポート:

GUIDと64ビット整数フィールドタイプ

Advantageサーバとクライアントを今GUIDと長整数(64ビットをサポート)データ型をすべての表形式で使用できます。 64ビット整数型を使用すると、-9,223,372,036,854,775,807,9,223,372,036,854,775,807の整数値を精度の損失なしで格納できます。 GUID(グローバル一意識別子)フィールドタイプは、16バイトのデータ構造です。新しいスカラー関数NewID()は、新しいGUIDを生成するために、式エンジンとSQLエンジンで使用できます。詳細については、「ADTフィールドの種類と仕様」および「DBFのフィールドの種類と仕様」を参照してください。

http://scn.sap.com/docs/DOC-68484

以前のバージョンでは、あなたはchar(36)としてのGUIDを格納することができます。 (もちろん、ここではperformanceの要件を考えてください。)次に、アプリケーション層でGUIDと文字列の間でいくつかの変換を行う必要があります。中間データアクセス層を使用している場合、たとえばNHibernateまたはEntity Frameworkを使用している場合、変換を少なくとも1つの場所にローカライズできるはずです。あなたのロジックの一部は、ストアドプロシージャ内にある場合、あなたはバッキング列のタイプに応じて、newid()またはnewidstring()機能を使用することができるはず

INSERT INTO Example_Table (newid(), OtherStuff) 
関連する問題