2017-10-04 17 views
0

テーブルを削除して「SELECT INTO」を使用して再作成するプロシージャを実行するとします。テーブルを削除した後の例外

このプロシージャでは、テーブルを削除した後に例外が発生した場合、テーブルの削除が行われるかどうかを確認します。

+0

はい私は、コミット・ステートメントが必要な箇所でoracle sqlを使用していない唯一の時間だと信じていますが、そのことを確認する必要があります。テストするのは簡単ですが、最初にテンポラリテーブルを選択してから、誤ったセレクトを使用してプロシージャを実行し、データベースにテンポラリテーブルを問い合わせます。それが存在しなければ、あなたは知っています。 – Danimal

答えて

0

あなたが取引でそれらをラップする場合を除き、各ステートメントは暗黙的なトランザクションと見なされるため、表はドロップされます。..以下

は、いくつかのテスト

create table t1 
(
id int not null primary key 
) 

drop table t11 
insert into t1 
select 1 union all select 1 

テーブルT11でも、削除されますされていますインサートは、例外..

もう一つの例を...上げるでしょうが

drop table orderstest 
print 'dropped table' 
waitfor delay '00:00:05' 
select * into orderstest 
from Orders 

今2秒後に、セッションを殺すために、あなたはまだ私はselect into以外のいくつかの他の文で確認

をドロップさorderstest見ることができ、私はselect intoは異なる動作をします理由が表示されていない、あなたがラップする場合にもこれが適用されますあなたはすべてをロールバックしたい場合はストアドプロシージャ内の文..

は、set xact_Abort on

0

より多くの、より良い使用をトランザクションを使用するか、はい、削除された表が消えてしまいます。新しいプライマリキーのスクリプトを作成するときにこの問題が発生しました。テーブルに応じて、すべてのデータをメモリ内のテーブル変数に保存し、テーブルを削除し、新しいpkで新しいテーブルを作成し、データをロードします。データが新しいpkに違反すると、文は失敗し、テーブル変数は削除され、新しいテーブルとデータは残されません。

私のプラクティスは、わずかに異なる名前の新しいテーブルを作成し、データをロードし、ステートメントの両方のテーブル名を変更してから、すべてのデータがロードされたことを確認したら元のテーブルを削除します。