PostgreSQL Antipatterns: рдПрдХ рдЯреНрд░рд┐рдЧрд░ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдбреЗрдЯрд╛ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ

рдЬрд▓реНрджреА рдпрд╛ рдмрд╛рдж рдореЗрдВ, рдХрдИ рдХреЛ рдЯреЗрдмрд▓ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╛рдореВрд╣рд┐рдХ рд░реВрдк рд╕реЗ рдХреБрдЫ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдмрддрд╛ рджрд┐рдпрд╛ рдерд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдмреЗрд╣рддрд░ рдХрд┐рдпрд╛ рдЬрд╛рдП , рдФрд░ рдХреИрд╕реЗ - рдЗрд╕реЗ рдирд╣реАрдВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЖрдЬ рдореИрдВ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЕрджреНрдпрддрди рдХреЗ рджреВрд╕рд░реЗ рдкрд╣рд▓реВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдБрдЧрд╛ - рдЯреНрд░рд┐рдЧрд░ рдЯреНрд░рд┐рдЧрд░ ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдореЗрдЬ рдкрд░ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рдХреБрдЫ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдПрдХ рдмреБрд░рд╛рдИ рдЯреНрд░рд┐рдЧрд░ рд▓рдЯрдХрд╛ рд╣реБрдЖ рд╣реИ ON UPDATE, рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдХреБрдЫ рд╕рдореБрдЪреНрдЪрдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдФрд░ рдЖрдкрдХреЛ рд╕рдм рдХреБрдЫ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдпрд╛ рдХреНрд╖реЗрддреНрд░ рд╢реБрд░реВ рдХрд░реЗрдВ) рдЗрддрдиреА рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдХрд┐ рдпреЗ рдЗрдХрд╛рдЗрдпрд╛рдВ рдкреНрд░рднрд╛рд╡рд┐рдд рди рд╣реЛрдВред

рдЪрд▓реЛ рдЯреНрд░рд┐рдЧрд░ рдХреЛ рдмрдВрдж рдХрд░реЗрдВ!


BEGIN;
  ALTER TABLE ... DISABLE TRIGGER ...;
  UPDATE ...; --  -
  ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;

рджрд░рдЕрд╕рд▓, рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реИ - рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рдЯрдХрд╛ рд╣реБрдЖ рд╣реИ ред

рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ ALTER TABLEрдПрдХ AccessExclusive рд▓реЙрдХ рд▓рдЧрд╛рддрд╛ рд╣реИ , рдЬрд┐рд╕рдХреЗ рддрд╣рдд рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рдирд╣реАрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рднреА SELECT, рдЯреЗрдмрд▓ рд╕реЗ рдХреБрдЫ рднреА рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЬрдм рддрдХ рдпрд╣ рд▓реЗрди-рджреЗрди рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рд╣рд░ рдХреЛрдИ рдЬреЛ "рдмрд╕ рдкрдврд╝рддрд╛ рд╣реИ" рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧрд╛ред рдФрд░ рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ UPDATEрд╣рдо рдХрд░рддреЗ рд╣реИрдВ-рдУ-рдУрд▓реНрдЧреА ...

рдЪрд▓реЛ рдЬрд▓реНрджреА рд╕реЗ рдЗрд╕реЗ рдмрдВрдж рдХрд░реЗрдВ, рдлрд┐рд░ рдЗрд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рдЪрд╛рд▓реВ рдХрд░реЗрдВ!


BEGIN;
  ALTER TABLE ... DISABLE TRIGGER ...;
COMMIT;

UPDATE ...;

BEGIN;
  ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;

рдпрд╣рд╛рдВ рд╕реНрдерд┐рддрд┐ рдмреЗрд╣рддрд░ рд╣реИ, рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рдордп рдмрд╣реБрдд рдХрдо рд╣реИред рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╕рднреА рд╕реБрдВрджрд░рддрд╛ рдХреЛ рдЦрд░рд╛рдм рдХрд░рддреА рд╣реИрдВ:

  • ALTER TABLE рд╡рд╣ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдореЗрдЬ рдкрд░ рдЕрдиреНрдп рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ SELECT
  • рдЬрдмрдХрд┐ рдЯреНрд░рд┐рдЧрд░ рдмрдВрдж рд╣реИ, рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЛрдИ рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ ред рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдЗрд╕реЗ рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрд╕реАрдмрдд!

рд╕рддреНрд░ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкреНрд░рдмрдВрдзрди


рдЗрд╕рд▓рд┐рдП, рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдо рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИ - рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдЯреНрд░рд┐рдЧрд░ рдХреЛ "рд╣рдорд╛рд░реЗ" рдирд╣реАрдВ рд╕реЗ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ "рд╣рдорд╛рд░реЗ" рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рднреЗрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред "рд╣рдорд╛рд░рд╛" рдХреЛ рдЫреЛрдбрд╝реЗрдВ, рд▓реЗрдХрд┐рди "рд╣рдорд╛рд░рд╛ рдирд╣реАрдВ" - рдЯреНрд░рд┐рдЧрд░ред рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рддреНрд░ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

session_replication_role


рдореИрдиреБрдЕрд▓ рдкрдврд╝реЗрдВ :
рдЯреНрд░рд┐рдЧрд░ рдЪрд░ рднреА session_replication_role рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЪрд░ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддрд╛ рд╣реИ ред рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрджреЗрд╢ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ) рдХреЗ рдмрд┐рдирд╛ рд╕рдХреНрд╖рдо рдХрд┐рдП рдЧрдП рдЯреНрд░рд┐рдЧрд░ рддрдм рдлрд╛рдпрд░ рдХрд░реЗрдВрдЧреЗ рдЬрдм рдкреНрд░рддрд┐рдХреГрддрд┐ рднреВрдорд┐рдХрд╛ "рдореВрд▓" (рдбрд┐рдлрд╝реЙрд▓реНрдЯ) рдпрд╛ "рд╕реНрдерд╛рдиреАрдп" рд╣реЛред рд╕рдВрдХреЗрдд рджреНрд╡рд╛рд░рд╛ рд╕рдХреНрд╖рдо рдХрд┐рдП рдЧрдП рдЯреНрд░рд┐рдЧрд░ ENABLE REPLICAрдХреЗрд╡рд▓ рддрднреА рдЪрд╛рд▓реВ рд╣реЛрдВрдЧреЗ рдЬрдм рдЪрд╛рд▓реВ рд╕рддреНрд░ рдореЛрдб "рдкреНрд░рддрд┐рдХреГрддрд┐" рд╣реЛрдЧрд╛, рдФрд░ рд╕рдВрдХреЗрдд рджреНрд╡рд╛рд░рд╛ рд╕рдХреНрд╖рдо рдХрд┐рдП рдЧрдП рдЯреНрд░рд┐рдЧрд░ ENABLE ALWAYSрд╡рд░реНрддрдорд╛рди рдкреНрд░рддрд┐рдХреГрддрд┐ рдореЛрдб рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрдЧ рд▓рдЧрд╛рдПрдВрдЧреЗред
рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ ALTER TABLE, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдПред рдХреБрд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдЖрд╡реЗрджрди рдЖрдЧ рдирд╣реАрдВ рдЪрд▓рд╛рддрд╛ рд╣реИ:

SET session_replication_role = replica; --  
UPDATE ...;
SET session_replication_role = DEFAULT; --    

рдЯреНрд░рд┐рдЧрд░ рдХреЗ рдЕрдВрджрд░ рдХреА рд╕реНрдерд┐рддрд┐


рд▓реЗрдХрд┐рди рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдХрд▓реНрдк рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдЯреНрд░рд┐рдЧрд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдпрд╛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдЯреНрд░рд┐рдЧрд░ "рдЯреНрд░рд┐рдЧрд░" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЕрдХреНрд╖рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)ред рдФрд░ рдЕрдЧрд░ рд╣рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреНрд░рд┐рдЧрд░ рдХреЛ "рдмрдВрдж" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ? "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" рд╕рддреНрд░ рдЪрд░

рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ :
рд╡рд┐рд╕реНрддрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ: рд╡рд┐рд╕реНрддрд╛рд░ рдирд╛рдо, рдЕрд╡рдзрд┐, рдФрд░ рдлрд┐рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо рд╣реА, SQL рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдкреВрд░реНрдг рдирд╛рдореЛрдВ рдХреА рддрд░рд╣ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: plpgsql.variable_conflictред
рдЪреВрдВрдХрд┐ рдЧреИрд░-рд╕рд┐рд╕реНрдЯрдо рдкреИрд░рд╛рдореАрдЯрд░ рдЙрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЙрдбреНрдпреВрд▓ рдХреЛ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, PostgreSQL рджреЛ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдирд╛рдо рдХреЗ рд▓рд┐рдП рдорд╛рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЯреНрд░рд┐рдЧрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:
BEGIN
    --     
    IF current_setting('mycfg.my_table_convert_process') = 'TRUE' THEN
        IF TG_OP IN ('INSERT', 'UPDATE') THEN
            RETURN NEW;
        ELSE
            RETURN OLD;
        END IF;
    END IF;
...

рд╡реИрд╕реЗ, рдпрд╣ CREATE OR REPLACEрдПрдХ рдЯреНрд░рд┐рдЧрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП , рддрд╛рд▓реЗ рдХреЗ рдмрд┐рдирд╛, "рд▓рд╛рднрдкреНрд░рдж рд░реВрдк рд╕реЗ" рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдФрд░ рдлрд┐рд░ рд╡рд┐рд╢реЗрд╖ рдХрдиреЗрдХреНрд╢рди рдореЗрдВ рд╣рдо "рд╣рдорд╛рд░реЗ" рдЪрд░ рдХреЛ рдореБрд░реНрдЧрд╛ рдХрд░рддреЗ рд╣реИрдВ:

SET mycfg.my_table_convert_process = 'TRUE';
UPDATE ...;
SET mycfg.my_table_convert_process = ''; --    

рдХреНрдпрд╛ рдЖрдк рдЕрдиреНрдп рддрд░реАрдХреЗ рдЬрд╛рдирддреЗ рд╣реИрдВ? рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред

All Articles