2016-04-29 15 views
1

私のpostgresqlデータベースには54のテーブルがあります。そして、テーブルの大半はデータの作成日時を含みます。私はCreatedDate列を含むすべてのテーブルのグローバルトリガーを作成したいと思います。レコードが挿入されると、このトリガーによって列が更新されます。作成日を含むすべてのテーブルのPostgresqlトリガー

+0

は、なぜあなたは単に今 'デフォルト()'に列を変更しないでください? –

+0

デフォルトのnow()は、SQLの挿入クエリで正常に動作します。しかし、QGISのようなサードパーティのソフトウェアを使ってテーブルにレコードを挿入しています。この発言では、新しいレコードはフォームを使って手動で作成されています。日付を手動で作成するのを忘れた場合、日付フィールドはデータベーステーブルにNULLになります。 – barteloma

+0

なぜあなたはgis.stackexchange.comに尋ねてみませんか?これに対する解決策は間違いありません。私はqgisが挿入時のデフォルトを処理できないとは思っていません。 –

答えて

3

各テーブルには、独自のトリガを必要としますが、単一のトリガ機能を使用することができます

CREATE TRIGGER set_createddate 
BEFORE INSERT ON <table name> 
FOR EACH ROW EXECUTE PROCEDURE set_created_date(); 

あなたはトリガーを設定することができます:あなたはこのようなトリガーを持っている必要があり、各テーブルについて

CREATE FUNCTION set_created_date() RETURNS trigger AS $$ 
BEGIN 
    NEW.createddate := CURRENT_TIME; 
    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 

をこのコードを含む54個のテーブルすべて(最初にトリガー関数を作成します):

DO $$ 
DECLARE 
    t record; 
BEGIN 
    FOR t IN 
     SELECT * FROM information_schema.columns 
     WHERE column_name = 'createddate' 
    LOOP 
     EXECUTE format('CREATE TRIGGER set_createddate 
         BEFORE INSERT ON %I.%I 
         FOR EACH ROW EXECUTE PROCEDURE set_created_date()', 
         t.schema_name, t.table_name); 
    END LOOP; 
END; 
$$ LANGUAGE plpgsql; 

このobvio私たちは、createddateという名前の列を持つ他のテーブルがないと仮定しています。これは、information_schema.columnsテーブルを照会することで簡単に確認できます。

0

パトリックの解決策にいくつかの問題がある人のために。 ここではいくつかの改善と同じコード:

DO $$ 
DECLARE 
    t text; 
BEGIN 
    FOR t IN 
     SELECT table_name FROM information_schema.columns 
     WHERE column_name = 'createddate' 
    LOOP 
     EXECUTE format('CREATE TRIGGER set_createddate 
         BEFORE INSERT ON %I 
         FOR EACH ROW EXECUTE PROCEDURE set_created_date()', 
         t); 
    END LOOP; 
END; 
$$ LANGUAGE plpgsql; 
+0

一般的に、答えには コードが何を意図しているのか説明し、他のものを導入しないで問題を解決する理由が含まれていれば、 – Peter

関連する問題