0

テーブルをフォームから XML にパッケージ化し、それを SQL Server 2008 R2 データベースのストアド プロシージャに送信するバインドされていないアクセス インターフェイスがあります。

送信される XML は次のようになります。

<maps>
  <map>
    <gmapId>1396</gmapId>
    <citation>Gray, Carlyle; Shepps, V.C.; Conlin, R.R.; Hoskins, D.M.; Shaffner, M.N.; Socolow, A.A.; McLaughlin, D.B.; Geyer, A.R.; Cate, A.S.; Lytle, W.S.; Bergsten, J.M.; Miller, J.T.; Wood, G.H., Jr.; Arndt, H.H.; Kehn, T.M., 1960, Geologic map of Pennsylvania (1960), Pennsylvania Geological Survey, Map, 1:250000 scale</citation>
    <use>no</use>
  </map>
</maps>

多くの場合、複数 (>100) のマップ要素があります。

私のストアド プロシージャには、xml を一時テーブルにアンボックスし、その一時テーブル情報を使用してデータベース内のいくつかのテーブルを更新するコードがあります。

そのコードは次のようになります。

INSERT INTO dbo.#mapsXref (npsUnitCode, gmapIdF, useForThisPark, citation)
        SELECT @unitCode As npsUnitCode, 
            T.item.value('gmapId[1]','INT') As gmapIdF,
            T.item.value('use[1]','VARCHAR(10)') As useForThisPark ,
            T.item.value('citation[1]', 'VARCHAR(MAX)') As citation
            FROM @mapsList.nodes('maps/map') AS T(item)

監査テーブルを使用して、XML が適切にパッケージ化され、適切な情報が表示され、一時テーブルが正しく入力されていることを確認できます。

INSERT INTO dbo.mapsXrefAudit(npsUnitCode, gmapIdF, useForThisPark, citation)
SELECT npsUnitCode, gmapIdF, useForThisPark, citation from dbo.#mapsXref

これは、一時テーブルに入るものをすべてキャッチし、サーバーへのデータの送信と XML 文字列の適切なアンパックを検証することを可能にします。

最初の更新は機能します:

UPDATE map.XREF_GMAP_ID_TRANSLATIONS 
        SET useForThisPark = t.useForThisPark
        FROM map.XREF_GMAP_ID_TRANSLATIONS x INNER JOIN dbo.#mapsXref t 
            ON x.gmapIdF = t.gmapIdF WHERE x.npsUnitCode = t.npsUnitCode

しかし、ストアド プロシージャが一時テーブルを使用して別のテーブルを更新すると、次のようになります。

UPDATE map.TBL_GMAPS
        SET reference = t.citation
        FROM  dbo.#mapsXref t INNER JOIN map.TBL_GMAPS g
            ON g.gmapId = t.gmapIdF

アップデートは に表示されませんmap.TBL_GMAPS

別の SQL Server 2008 R2 インスタンスで数年間機能していました (現在、DBA から古いビルド # を取得しようとしています。取得できれば、その情報で更新します)。

数週間前、サーバーの大失敗があり、データベースはビルド 10.50.4000 を実行する新しいサーバーに移行されました。前述のアクセスアプリケーションのさまざまな部分でアクセス許可に関するエラーがスローされるため、一連のオブジェクトレベルのアクセス許可を再設定する必要がありましたが、現在、これらの問題は発生していないようです. 何か問題が発生した場合にロールバックしてエラーメッセージを生成するトランザクションにビット全体をラップしました。しかし、コミット時にエラーは発生しません。

パラメータとトランザクション コード以外のストアド プロシージャのほとんどの部分について説明しました。フルバージョンはこちら: https://gist.github.com/anonymous/5536290

map.TBL_GMAPS私のテーブルで更新が行われない理由を誰か知っていますか?

4

1 に答える 1

1

私はこれを理解しました。誰か (私) が数年前に TBL_GMAPS でトリガーを定義し、INSERT 時に USGS スタイルの引用を自動的に生成しました。問題のコードがテーブルを更新するたびに、トリガーが起動して引用をリセットします。それを修正するために、ここで解決策を使用しました-特定のSQLステートメントまたはセッションのトリガーを無効にします。

上記の UPDATE セクションを次のように変更しました。

SET CONTEXT_INFO 0x555555
UPDATE map.TBL_GMAPS
        SET reference = t.citation
        FROM  dbo.#mapsXref t INNER JOIN map.TBL_GMAPS g
            ON g.gmapId = t.gmapIdF

次に、トリガーで CONTEXT_INFO をチェックして、設定されているかどうかを確認します

DECLARE @Cinfo VARBINARY(128)
SELECT @Cinfo = CONTEXT_INFO()
If @Cinfo = 0x555555
  RETURN

UPDATE map.TBL_GMAPS SET
reference=dbo.createUsgsCitation(m.gmapId)
FROM inserted i INNER JOIN  map.TBL_GMAPS m
ON m.gmapId = i.gmapId

それは私の問題を修正しました。

于 2013-05-14T02:12:40.257 に答える