1

DB全体のすべてのテーブル列をデータ型からに変更する必要がありました。 だから私はこの関数を作成しました: timestampwithouttime zonetimestamp(0)withtime zone

CREATE OR REPLACE FUNCTION grd_replace_datetime_with_timezone()
  RETURNS character varying AS
$BODY$

DECLARE
  old_column RECORD;  
    s text;
BEGIN

FOR old_column IN (
    SELECT
        isc.table_schema as table_schema,
        isc.table_name as table_name,
        isc.column_name as column_name
    FROM 
        information_schema.columns  isc
    INNER JOIN 
        pg_tables pt
            ON (isc.table_schema = pt.schemaname and isc.table_name = pt.tablename)
    WHERE
        isc.column_name like '%date%' and 
        isc.table_schema in ('public') and 
        isc.data_type = 'timestamp without time zone'
    ORDER BY
        isc.table_name ASC
    ) 
LOOP
    RAISE NOTICE 'Schema: %',old_column.table_schema;
    RAISE NOTICE 'Table: %',old_column.table_name;
    RAISE NOTICE 'Column %',old_column.column_name;


    EXECUTE 'ALTER TABLE '||old_column.table_schema||'.'||old_column.table_name||'
                ALTER COLUMN '||old_column.column_name||' TYPE timestamp(0) with time zone';

    RAISE NOTICE '-------------------------------------------------------------------------------';
    RAISE NOTICE '';
END LOOP;


RETURN 'S';
END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

しかし、一部のビューは影響を受ける列に依存しており、エラーが発生しました:

ERROR:  cannot alter type of a column used by a view or rule

また、インデックスに関するエラーが発生しました。

timestamp without time zoneすべての列のデータ型を変更するには?

4

2 に答える 2

1

私の知る限り、データ型が変更されたときにビューに応じて自動変更する組み込みの方法はありません。
2 つの可能性があります。

  1. DROPタイプが変更される前にすべての依存ビューを変更し、後でそれらを再作成します。

  2. まったく異なるアプローチ:データベースをダンプし、ダンプ内のテーブル定義を変更して復元します。同じタイムゾーンでそれを行う限り、正しくtimestamp without time zone強制する必要があります。timestamptz(0)キャスト toは完全な秒にtimestamptz(0) 丸められることに注意してください。

オブジェクトが一握り以上ある場合は、ダウンタイムに余裕がある場合は、ダンプと復元が適しています。

デモ

CREATE TEMP TABLE t  (id int, x timestamp);
CREATE TEMP TABLE t1 (id int, x timestamptz(0);

INSERT INTO t VALUES
 (1, '2019-05-25 13:23:03.123')  -- rounds down
 (1, '2019-05-25 13:23:03.987')  -- rounds up
,(2, '2019-05-25 23:23:03')
,(3, '2019-05-25 0:0:0');

COPY t  TO   '/var/lib/postgres/ts_test.sql';
COPY t1 FROM '/var/lib/postgres/ts_test.sql';

SELECT t.x, t.x::timestamptz(0), t1.x
FROM   t
JOIN   t1 USING (id);

強制は自動的かつ正しく行われます。

関連している:

于 2012-05-25T11:18:43.030 に答える
1

pg_dump で試すことができます

最初に --format=plain --schema-only でダンプを作成します

ダンプ ファイルのデータ型を変更し、新しいデータベースに復元します。

--data-only でダンプを作成し、それらを新しいデータベースに復元するよりも。

于 2012-05-25T11:23:38.303 に答える