Oracle:制約のENABLED/DISABLED

Oracle のデータベースを直接いじっていた時に、うっかり同じ INSERT 文を2回走らせたところ、エラーなく2回とも取り込まれてしまった。
一意制約に引っかかってはいらないはずと思いつつ、グーグってプライマリーキーを表示するSQLを走らせると、プライマリーキーは確かに設定されているように見える。一方で、やはり一意制約を満たさないデータが入ってしまう。
コピペしたスキーマ情報を得るSQLを確認すると、user_constraints テーブルに status というカラムが存在するのを発見。
元のSQL ではこのカラム情報を表示させていなかったので SELECT に含めてみたら、件の プライマリーキーはステータスが DISABLED になっていた。

user_constraints.last_change は何年か昔のサーバ移転時のタイムスタンプだった。自分が引き継ぐはるか昔から DISABLED 状態だったと思われる。

何が嬉しくてわざわざ disable  にしたのかと思いつつも、プログラムバグやヒューマンエラーで変なデータ入るのは勘弁ということで、プライマリーキーを復活させて一件落着。

ALTER TABLE 表名 ENABLE CONSTRAINT 制約名;

■制約の enabled/disabled を確認するシンプルなSQL

SELECT constraint_type, constraint_name, status
  FROM user_constraints
 WHERE table_name = テーブル名;
Advertisements
Tagged with: , , , ,
Posted in database

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
%d bloggers like this: