Robert Wysocki robert.wysocki at unity.pl
Tue Jul 23 00:27:47 PDT 2013
Dnia 2013-07-22, pon o godzinie 17:37 -0400, Christopher Browne pisze:
> The behaviour should be a bit further different...
> 
> 
> The log triggers are supposed to be suppressed on *all* nodes when
> DDL/DML is being run via EXECUTE SCRIPT by virtue of having the GUC
> set to "local".
> 
> 
> In effect, what's to happen is...
> 
> 
> - Start of EXECUTE SCRIPT processing:
>    set session_replication_role to local; 
> 
> 
>  - Process DDL/DML statements
> 
> 
> - set session_replication_role to replica;
> 
Thanks for answers. I've managed to narrow it down to one case:
SELECT from one table run with slonik_execute_script calls a function
which in turn INSERTs into another table. Both tables are in the same
replication set.

In the node log I have:
2013-05-23 12:01:58 CEST CONFIG remoteWorkerThread_1: DDL Statement 17:
[

INSERT INTO euro_audit.b24_messages_aud(
                    id, rev, revtype, 
                    page_label, "content", wysiwygable,
                    content_for_mobile_active, content_for_mobile, 
                    note, message_type_id)
        SELECT id,  getRevId('Inicjalizacja wersjonowania','MESSAGE'),
0, 
                                page_label, "content", wysiwygable, 
                                content_for_mobile_active,
content_for_mobile,
                                note, message_type_id
          FROM euro.b24_messages 
          WHERE page_label =
'not-added-services-shop-delivery-encouragement-message';]
2013-05-23 12:01:58 CEST ERROR  DDL Statement failed - PGRES_FATAL_ERROR

In postgres log at the receiver end I have:
[2013-05-23 12:01:58 CEST] slony1 at 10.1.12.21(39802):si_euro [21146]
519de916.529a/11:3799790 ERROR:  duplicate key value violates unique
constraint "revisions_pkey"
[2013-05-23 12:01:58 CEST] slony1 at 10.1.12.21(39802):si_euro [21146]
519de916.529a/12:3799790 DETAIL:  Key (id)=(1) already exists.
[2013-05-23 12:01:58 CEST] slony1 at 10.1.12.21(39802):si_euro [21146]
519de916.529a/13:3799790 CONTEXT:  SQL statement "INSERT INTO
euro_audit.revisions(

The function in question:
si_euro=# \sf getrevid (text,text)
CREATE OR REPLACE FUNCTION public.getrevid(rev_comment text,
audit_class_name text)
 RETURNS bigint
 LANGUAGE plpgsql
AS $function$
                DECLARE
                    rev_id bigint := 0;

BEGIN
                    
                            IF audit_class_name IS NULL OR 
                                    audit_class_name NOT SIMILAR TO
'(ARTICLE|CMS_PAGE|DEFINITION|EMAIL|IP_RULE
                                     |MESSAGE|PRODUCT_PROMOTION_PRICE|
SHOP_IN_SHOP_BANNER|SHOP_IN_SHOP
                                     |STATUS_CODE|SYSTEM_PARAMETER|
XSL_DEFINITION|BANNER|SHOP)'
                           THEN RAISE EXCEPTION 'Wywołanie getRevId(%,%)
przerwane. Taki audit_class_name nie istnieje - patrz
AuditableEntityClasses',rev_comment, audit_class_name;

END IF;

INSERT INTO euro_audit.revisions(
                            "comment", "timestamp", user_name,
class_name)
                    VALUES (rev_comment,  extract('epoch' from
CURRENT_TIMESTAMP) * 1000, 'System', audit_class_name);

rev_id = currval('euro_audit.revisions_id_seq');

return rev_id;

END;

$function$


Other DML statements done with slonik_execute_script do _not_ produce
such errors. Is it possible that function execution does not obey
session_replication_role settings?

Regards,
-- 
Robert Wysocki
administrator systemów linuksowych
administrator baz danych
Grupa Unity | ul. Przedmiejska 6-10, 54-201 Wrocław
ul. Conrada 55B, 31-357 Kraków | ul. Złota 59, 00-120 Warszawa



More information about the Slony1-general mailing list