Re: Restore - disable triggers - when they fired?

From: Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com>
To: Durumdara <durumdara(at)gmail(dot)com>
Cc: Postgres General <pgsql-general(at)postgresql(dot)org>
Subject: Re: Restore - disable triggers - when they fired?
Date: 2018-03-20 15:33:43
Message-ID: cdd36500-2d8c-2352-4f1f-b63a024dce15@aklaver.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 03/20/2018 07:56 AM, Durumdara wrote:
> Dear Adrian!
>
>
> 2018-03-20 15:47 GMT+01:00 Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com
> <mailto:adrian(dot)klaver(at)aklaver(dot)com>>:
>
>
>
> When it would be useful?
>
>
> https://www.postgresql.org/docs/10/static/app-pgrestore.html
> <https://www.postgresql.org/docs/10/static/app-pgrestore.html>
> "--disable-triggers
>
>     This option is relevant only when performing a data-only
> restore. It instructs pg_restore to execute commands to temporarily
> disable triggers on the target tables while the data is reloaded.
> Use this if you have referential integrity checks or other triggers
> on the tables that you do not want to invoke during data reload.
>
>     Presently, the commands emitted for --disable-triggers must be
> done as superuser. So you should also specify a superuser name with
> -S or, preferably, run pg_restore as a PostgreSQL superuser.
>
>
>
>
> Firstly I supposed that data copy somehow could start the
> triggers - but how?
>
> Which triggers? Or how they fired with this order?
>
>
>
> I have read it, but I don't understand it.
>
> Do you have a good example?

create table disable_trigger_test(id int PRIMARY KEY, fld_1 text);

insert into disable_trigger_test values (1, 'dog'), (2, 'cat');

test=> select * from disable_trigger_test ;
id | fld_1
----+-------
1 | dog
2 | cat

pg_dump --disable-triggers -d test -U aklaver -t disable_trigger_test -a
-f disable_trigger_test_data.sql

CREATE OR REPLACE FUNCTION public.trigger_test()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
begin
new.fld_1 := new.fld_1 || 'test';
RETURN NEW;
end;
$function$;

CREATE TRIGGER tr_test
BEFORE INSERT
ON disable_trigger_test
FOR EACH ROW
EXECUTE PROCEDURE public.trigger_test();

truncate disable_trigger_test ;

#Note I do this as a superuser.
psql -d test -U postgres -f disable_trigger_test_data.sql

test=> select * from disable_trigger_test ;
id | fld_1
----+-------
1 | dog
2 | cat

test=> insert into disable_trigger_test values (3, 'fish');
INSERT 0 1
test=> select * from disable_trigger_test ;
id | fld_1
----+----------
1 | dog
2 | cat
3 | fishtest
(3 rows)

>
> Thanks!
> dd

--
Adrian Klaver
adrian(dot)klaver(at)aklaver(dot)com

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Enrico Thierbach 2018-03-20 15:38:21 Re: SELECT .. FOR UPDATE: find out who locked a row
Previous Message Stuart McGraw 2018-03-20 15:23:18 postgresql-10.3 on unbuntu-17.10 - how??