SQL Server(MSDE2000) : ALTER TABLE
SQL Server(MSDE2000) : ALTER TABLE した項目に対し、直後に UPDATE で値をセットできない
既存のテーブルを仕様変更するため、列を追加し、初期値で埋める SQL 文を書こうとしていますが、うまく動かず、エラーとなってしまい、原因が判らず困っています。
サンプル SQL 文:
------
CREATE TABLE TEST_TABLE ( TEST_FIELD1 SMALLINT, TEST_FIELD2 SMALLINT)
INSERT INTO TEST_TABLE VALUES( 1, 2 )
ALTER TABLE TEST_TABLE ADD TEST_FIELD3 SMALLINT
UPDATE TEST_TABLE SET TEST_FIELD3 = 3
------
※テスト毎に、必ず DROP TABLE TEST_TABLE されている事が前提です。
上記 SQL 文のうち、1行目~3行目までを抜粋して実行すると、ちゃんと CREATE TABLE され、INSERT され、ALTER TABLE される事を確認しました。
ところが、4行目までを一気に実行しようとすると、
------
SQL実行中に以下のエラーが発生しました。
エラーコード:207 [Microsoft][ODBC SQL Server Driver][SQL Server]列名 'TEST_FIELD3' は無効です。
SQLステータス:S0022
------
となってしまい、UPDATE で初期値を埋める事ができません。
しかも、UPDATE に失敗するどころか、2行目の INSERT から以降が結果に反映されなくなるという状況に陥ってしまいます。
また、既存のテーブルの仕様変更が目的なので、その状況に近づけるために、まず、
------
CREATE TABLE TEST_TABLE ( TEST_FIELD1 SMALLINT, TEST_FIELD2 SMALLINT)
INSERT INTO TEST_TABLE VALUES( 1, 2 )
------
を実行し、既存のテーブル(とレコード内容)が存在する状態を作り出された事を、ツール等で確認してから、
------
ALTER TABLE TEST_TABLE ADD TEST_FIELD3 SMALLINT
UPDATE TEST_TABLE SET TEST_FIELD3 = 3
------
の2行を実行してみると、やはり UPDATE は失敗し、前述と同じエラーが発生します。
またこの場合、ALTER TABLE の実行結果も反映されていません。(つまり、TEST_FIELD3 が列追加されていない)
もちろん、ALTER TABLE だけを実行した場合には、ちゃんと列は追加されます。
その後に、UPDATE を実行すれば、ちゃんと追加列に初期値がセットされます。
どうやら、「一回の SQL 文の実行の中で、ALTER TABLE によって新設した列に対しては、UPDATE などでのアクセスはすぐにはできない」のではないか?という状況のようなのです。一回の SQL 文の実行の中において、何らかのトランザクション動作っぽい挙動を感じます。
つまり、ALTER TABLE で追加された列は、その時点ではまだ完全にシステムに認知されていないため、直後の UPDATE 文で認識できずに失敗するのではないか?と。そして、そこでのエラー発生が、ロールバック的に実行した処理をキャンセルしてしまうため、結果として、ALTER TABLE が実行されなかった事になったり、INSERT が実行されなかった事になったりしているのではないか?と思う次第です。
考えられる回避策としては、SQL 文を別々に作成し、個別に実行すれば良いだけの事なのですが、できれば、SQL 文一つにまとめたいと考えています。
どなたか、こういった現象に対する原因・理由の説明、或いは回避策など、何か情報をお持ちの方はいらっしゃいませんでしょうか?
宜しくお願いします。
お礼
ご回答ありがとうございました。 いろいろ項目を挙げていただき勉強になりました。 該当するものはなかったのでホッとしております。