Calender
Sun Mon Tue Wed Thu Fri Sat
     12
3456789
10111213141516
17181920212223
24252627282930
<< November 2019 >>
広告
SEARCH

SELECTED ENTRIES
RECENT COMMENTS
RECENT TRACKBACK
CATEGORIES
ARCHIVES
LINKS
PROFILE
OTHERS
SKYPE
PC: skype.jojo.jp
chat
iPad: iphone.jojo.jp
chat call
THANKS



本日:
昨日:
多言語
広告
 ▼▲ 作業日報 ▼△
    What's under the hood?
<< 初出航、ジェットスキーとヨット | main | Apache 特定ディレクトリを別サーバーへ転送 >>
【PostgreSQL】........pg.dropped.12........
postgresqlにてフィールドを削除しても内部的(pg_attribute)には消えていないようです。

attryipidが0になりますので一応判別はできますし、通常のSQL文には影響はないのですが(ただしattnum値はNG)、テーブル構造をSQLで取ってきているツールなどでは問題が起きそうです。原因ままだ調査中。

DBの再起動、VACUUM FULL しても消えず一度dump>restoreするしかないような感じです。。。

検証用SQL:
上から順番にコメントを外して検証してみてください
--Step1.create table abc ......abcテーブル作成
/*
create table abc(a int,b text,c text);
SELECT attname,attnum,a.relname,relid,attname,atttypid,atttypmod,b.conkey FROM pg_attribute,(SELECT 
relid, relname FROM pg_stat_user_tables WHERE schemaname='public' and relname='abc') AS a LEFT JOIN 
pg_constraint AS b ON (conrelid=relid) AND (contype='p') WHERE (a.relid = attrelid) AND (attnum > 0) 
ORDER BY relid, attnum ;
*/
--OK

--Step2.alter drop column c ...... cフィールド削除(問題発覚)
/*
alter table abc drop column c;
SELECT attname,attnum,a.relname,relid,attname,atttypid,atttypmod,b.conkey FROM pg_attribute,(SELECT 
relid, relname FROM pg_stat_user_tables WHERE schemaname='public' and relname='abc') AS a LEFT JOIN 
pg_constraint AS b ON (conrelid=relid) AND (contype='p') WHERE (a.relid = attrelid) AND (attnum > 0) 
ORDER BY relid, attnum ;
*/

--Step3.vacuum full abc ......vacuum full してみます
/*
vacuum full abc;
*/

--Step4.all the same  ヤッパリダメです。
/*
SELECT attname,attnum,a.relname,relid,attname,atttypid,atttypmod,b.conkey FROM pg_attribute,(SELECT 
relid, relname FROM pg_stat_user_tables WHERE schemaname='public' and relname='abc') AS a LEFT JOIN 
pg_constraint AS b ON (conrelid=relid) AND (contype='p') WHERE (a.relid = attrelid) AND (attnum > 0) 
ORDER BY relid, attnum ;
*/

--Data Check  ......普通のSQLでは問題は出ません  
/*
insert into abc values (1,'1');
insert into abc values (2,'2');
select * from abc;
*/
--OK
/*
copy  abc  to '/tmp/abc.txt'
*/
--OK

| 開発関連 | 16:25 | comments(0) | trackbacks(0) |









http://blog.jojo.jp/trackback/1424805