2017年12月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

« §PostgreSQL(pg_dumpでユーザ名とデータベース名と出力ファイル名を併記する方法) | トップページ | §PostgreSQL(外部キー制約解除/再設定SQLを自動生成する方法(その2)) »

2010年12月 4日 (土)

§PostgreSQL(外部キー制約解除/再設定SQLを自動生成する方法(その1))

PostgreSQLネタ第2弾です。ORACLEを扱っていた時代はデータディクショナリーというDB管理テーブルがありましたがPostgreSQLにもシステムカタログというテーブル&ビューが存在します。
今回、マスタテーブルへのデータ投入をしようとした際に外部キー制約があってうまくデータが投入できなかったので昔Oracle時代によくやった制約を解除して再設定する手順でやってみようと思いました。
(1)外部キー制約を外し、
(2)更新したいレコードをいったん削除し、
(3)削除したキーと同じレコードを新しい内容で追加し(つまり新規追加または更新ができる)、
(4)外部キー制約再設定する手順です。
一番確実に実行する方法はデータベース構造からalter table文を生成する方法だと思うので
Oracle時代はデータディクショナリからSQLを生成したものです。
例えば、こんな具合。(懐かしいなぁ)
spool dis_const.sql
set echo off
set feedback off
set heading off
set pagesize 0
set linesize 1000
set termout off
set trimspool on
select 'ALTER TABLE ' || table_name || ' DISABLE CONSTRAINTS ' || constraint_name || ';' from user_constraints where constraint_type ='R';
spool off

これに倣ってPostgreSQLでもこんな具合。
\o drop_sql
\t
select 'ALTER TABLE' || t.relname || ' DROP CONSTRAINT ' || c.conname || ';' from pg_class t,pg_constraint c where c.conrelid=t.relfilenode and contype='f';
\o

さて、ここで問題発生です。
Oracleは制約の再設定はENABLE CONSTRAINTSとするSQL文で生成可能ですが、PostgreSQLはADD CONSTRAINTとしなければなりません。何が問題かというと、どの親テーブルと外部キー制約を結ぶかという親テーブルの情報が必要になりますが残念ながらpg_constraint表にはその情報がないようです。いろいろネットで同じ悩みの方がいないか探したのですが見つからずSQL生成をあきらめました。
では、どうするのかというとpg_dumpツールを利用することにしました(これで前回のpg_dumpの話題につながるわけです)。
pg_dumpからDDLだけを出力し、その情報からalter table add constraint文だけを抽出するVBAマクロを作成しました。
そのマクロについては次回ご紹介します。

« §PostgreSQL(pg_dumpでユーザ名とデータベース名と出力ファイル名を併記する方法) | トップページ | §PostgreSQL(外部キー制約解除/再設定SQLを自動生成する方法(その2)) »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« §PostgreSQL(pg_dumpでユーザ名とデータベース名と出力ファイル名を併記する方法) | トップページ | §PostgreSQL(外部キー制約解除/再設定SQLを自動生成する方法(その2)) »