この資料は、ODBC リンク テーブル内のレコードが "#Deleted" と表示される現象について説明しています。
リンクされている ODBC テーブル内のレコードを取得、挿入、更新する際に、レコード内の各フィールド内に "#Deleted" (Access 2.0 では、"#削除") が表示されます。コードを使用してレコードを取得、挿入、更新する際に、"レコードは削除されます" というエラー メッセージが表示されます。
Microsoft Jet データベース エンジンは、キーセットドリブン モデルを基にデザインされています。データは、キーの値 (リンクされた ODBC テーブルの場合は、テーブルの一意のインデックス) に基づいてデータが取得、挿入、更新されます。
Access は、リンクされた ODBC テーブルの挿入または更新を行ってから、Where 条件を使用して再度レコードを選択し、挿入または更新を確認します。Where 条件は一意のインデックスに基づいています。選択がレコードを何も返さない原因には多くの要素が考えられますが、多くの場合、原因は、Access がキャッシュしているキー値が ODBC テーブル上の実際のキー値と同じでないということです。他に考えられる原因として、以下のようなものがあります。
-
テーブル上に、キー値を変更する更新または挿入のトリガがある。
-
一意のインデックスが浮動小数点型に基づいている。
-
サーバー上で正しい容量のスペースの埋め込みが行われる可能性のある固定長テキスト フィールドを使用している。
-
一意のインデックスを構成しているフィールド内に Null 値を含む、リンクされた ODBC テーブルを持っている。
これらの要素は、"#Deleted" と表示される直接の原因となるわけではありません。上記のような場合、Access はキー値維持の次の手順に進み、次にレコード内のその他すべてのフィールドに基づいた条件でレコードを選択します。この手順で複数のレコードが返された場合、Access は、信頼できるキー値がないため、"#Deleted" エラーを返します。テーブルを閉じ、再度開くか、[レコード] メニューから [全レコードの表示] を選択すると、"#Deleted" エラーは削除されます。
Access は同様のプロセスを使用してリンクされた ODBC テーブルからレコードを取得します。まず、キー値を、次にそのキー値に当てはまる残りのフィールドを、取得します。Access は、残りのレコードを探そうとしたときにその値を再度見つけることができない場合、レコードが削除されているとみなします。
この現象は Access の仕様に基づく動作です。
この動作を回避するために使用できる方法の一部を以下に示します。
-
一意のインデックスを除き、まったく同じレコードの入力を避ける。
-
一意のインデックスと他のフィールドの両方の更新を誘発する更新を避ける。
-
[浮動小数点型] フィールドを一意のインデックスまたは一意のインデックスの一部として使用しない (このデータ タイプに固有の丸めの問題を防ぐため)。
-
すべての更新や挿入を SQL パススルー クエリーを使用して行い、ODBC データ ソースに送信される内容をすべて把握できるようにする。
-
SQL パススルー クエリーを使用してレコードを取得する。SQL パススルー クエリーは更新不可能であるため、"#Deleted" エラーを引き起こしません。
-
リンクされている ODBC テーブルの一意のインデックスを構成しているフィールド内に Null 値を保存しないようにする。
再現手順
-
SQL Server のクエリ アナライザ (SQL Server 6.5 以前では iSQL/w) を起動します。
-
ユーザー "sa" でログインし、"pubs" データベースに接続します。
-
以下の SQL スクリプトを実行し、SQL Server 上にテーブルを作成します。
CREATE DEFAULT dbo.UW_ZeroDefault AS 0
GO
CREATE TABLE 運送会社 (
運送コード int NULL ,
運送会社 varchar (10) NULL)
GO
CREATE UNIQUE CLUSTERED INDEX PK_運送コード ON 運送会社 (運送コード)
GO
EXEC sp_bindefault 'UW_ZeroDefault', '運送会社.運送コード'
GO
CREATE TRIGGER 運送会社_挿入トリガ ON 運送会社 FOR INSERT AS
DECLARE @maxc int, @newc int
SELECT @maxc = (SELECT Max(運送コード) FROM 運送会社)
SELECT @newc = (SELECT 運送コード FROM inserted)
IF @newc = 0 OR @maxc <> @newc SELECT @maxc = @maxc + 1
UPDATE 運送会社 SET 運送コード = @maxc WHERE 運送コード = @newc
GO
INSERT 運送会社 VALUES(1,'ネコ')
INSERT 運送会社 VALUES(2,'トマト')
INSERT 運送会社 VALUES(3,'ペンギン')
-
Access から ODBC を経由して、SQL Server 上の [運送会社] テーブルをリンクします。
-
リンクされている [運送会社] テーブルを開き、新規のレコードを入力します。入力するレコードの [会社名] フィールドのデータが前のレコードと同じであることを確認してください。
-
Tab キーを押して新規のレコードに移動します。入力したレコードに "#Deleted" と表示されています。
- テーブルを閉じて、再度テーブルを開きます。レコードの値が正く表示されています。
注意 : Access 2.0 では、リンク テーブルはアタッチ テーブルと呼ばれていました。
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID
128809
(http://support.microsoft.com/kb/128809/EN-US/
)
(最終更新日 2000-08-09) をもとに作成したものです。
文書番号: 128809 - 最終更新日: 2004年1月23日 - リビジョン: 4.0
この資料は以下の製品について記述したものです。
- Microsoft Access 97 Standard Edition
- Microsoft Access 95 Standard Edition
- Microsoft Access 2.0 Standard Edition
| # 7.0 8.0 acc10 acc2000 acc95 acc97 accxp deleted kbinfo linked odbc table xp アタッチテーブル リンク 一意 削除 KB128809 |
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"
サポート期間が終了した「サポート技術情報」資料に関する免責事項この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。