PostgreSQL எதிர்ப்பு வடிவங்கள்: தூண்டுதலைத் தவிர்த்து தரவை மாற்றவும்

விரைவில் அல்லது பின்னர், அட்டவணை பதிவுகளில் எதையாவது பெருமளவில் சரிசெய்ய வேண்டிய அவசியத்தை பலர் எதிர்கொள்கின்றனர். நான் ஏற்கனவே அதை எப்படி சிறப்பாக செய்வது என்று சொல்லுங்கள், மற்றும் எப்படி - அதை செய்யாமல் இருப்பது நல்லது. இன்று நான் வெகுஜன புதுப்பிப்பின் இரண்டாவது அம்சத்தைப் பற்றி பேசுவேன் - தூண்டுதல்கள் பற்றி.

எடுத்துக்காட்டாக, நீங்கள் எதையாவது சரிசெய்ய வேண்டிய மேஜையில், ஒரு தீய தூண்டுதல் தொங்குகிறது ON UPDATE, எல்லா மாற்றங்களையும் சில திரட்டுகளுக்கு மாற்றுகிறது. நீங்கள் எல்லாவற்றையும் புதுப்பிக்க வேண்டும் (உதாரணமாக, ஒரு புதிய புலத்தை துவக்கவும்) இந்த திரட்டுகள் பாதிக்கப்படாமல் கவனமாக இருக்க வேண்டும்.

தூண்டுதல்களை மட்டும் முடக்குவோம்!

BEGIN;
  ALTER TABLE ... DISABLE TRIGGER ...;
  UPDATE ...; -- тут долго-долго
  ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;

உண்மையில், அவ்வளவுதான் - எல்லாம் தொங்கிக்கொண்டிருக்கிறது.

ஏனெனில் ALTER TABLE சுமத்துகிறது பிரத்தியேக அணுகல்- யாரும் இணையாக இயங்காத பூட்டு, எளிமையானது கூட SELECT, மேசையிலிருந்து எதையும் படிக்க முடியாது. அதாவது, இந்த பரிவர்த்தனை முடியும் வரை, "சும்மா படிக்க" விரும்பும் அனைவரும் காத்திருப்பார்கள். நாங்கள் அதை நினைவில் கொள்கிறோம் UPDATE எங்களிடம் நீண்ட காலம்...

விரைவாக அதை அணைப்போம், பின்னர் விரைவாக அதை இயக்கவும்!

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

UPDATE ...;

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

இங்கே நிலைமை ஏற்கனவே சிறப்பாக உள்ளது, காத்திருக்கும் நேரம் மிகவும் குறைவாக உள்ளது. ஆனால் இரண்டு பிரச்சினைகள் மட்டுமே எல்லா அழகையும் கெடுக்கின்றன:

  • ALTER TABLE நீண்ட செயல்பாடுகள் உட்பட, மேசையில் உள்ள மற்ற அனைத்து செயல்பாடுகளுக்கும் அதுவே காத்திருக்கிறது SELECT
  • தூண்டுதல் முடக்கத்தில் இருக்கும்போது எந்த மாற்றமும் "பறக்க" மேஜையில், நம்முடையது கூட இல்லை. அது வேண்டும் என்றாலும், மொத்தத்தில் சேராது. பிரச்சனை!

அமர்வு மாறிகளை நிர்வகித்தல்

எனவே, முந்தைய பதிப்பில், நாங்கள் ஒரு அடிப்படை புள்ளியில் தடுமாறினோம் - அட்டவணையில் "எங்கள்" மாற்றங்களை "நம்முடையது அல்ல" என்பதிலிருந்து வேறுபடுத்துவதற்கான தூண்டுதலை எப்படியாவது கற்பிக்க வேண்டும். "நம்முடையது" அப்படியே தவிர்க்கப்பட்டது, ஆனால் "நம்முடையது அல்ல" என்பதில் அவை தூண்டப்படுகின்றன. இதற்கு நீங்கள் பயன்படுத்தலாம் அமர்வு மாறிகள்.

அமர்வு_பிரதி_பாத்திரம்

படி கையேடு:

தூண்டுதல் பொறிமுறையானது கட்டமைப்பு மாறியால் பாதிக்கப்படுகிறது அமர்வு_பிரதி_பாத்திரம். கூடுதல் வழிமுறைகள் (இயல்புநிலை) இல்லாமல் இயக்கப்பட்டால், பிரதியெடுத்தல் பங்கு "தோற்றம்" (இயல்புநிலை) அல்லது "உள்ளூர்" என இருக்கும்போது தூண்டுதல்கள் செயல்படும். குறிப்பதன் மூலம் தூண்டுதல்கள் இயக்கப்பட்டன 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 = ''; -- вернули в исходное состояние

உங்களுக்கு வேறு வழிகள் தெரியுமா? கருத்துகளில் பகிரவும்.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்