Pre-loader


Як відключити/включити всі Constraints

Відключення/включення обмежень (constraints) для певної таблиці в Postgresql 16

Для відключення всіх не системних обмежень (constraints) в PostgreSQL 16 та створення хранимої процедури, яка може включати або відключати обмеження залежно від вхідного параметра, ось приклад:

CREATE OR REPLACE PROCEDURE toggle_constraints(table_name text, enable_constraints boolean)
LANGUAGE plpgsql
AS $$
DECLARE
    constraint_record record;
BEGIN
    -- Перебираємо всі не системні обмеження для конкретної таблиці
    FOR constraint_record IN (SELECT conname, conrelid::regclass
                             FROM pg_constraint
                             WHERE connamespace = (SELECT oid FROM pg_namespace WHERE nspname = `public`) AND confrelid = table_name::regclass)
    LOOP
        IF enable_constraints THEN
            -- Включаємо обмеження, якщо enable_constraints = TRUE
            EXECUTE `ALTER TABLE ` || constraint_record.conrelid || ` ENABLE TRIGGER ALL`;
        ELSE
            -- Вимикаємо обмеження, якщо enable_constraints = FALSE
            EXECUTE `ALTER TABLE ` || constraint_record.conrelid || ` DISABLE TRIGGER ALL`;
        END IF;
    END LOOP;
END;
$$;

В цій процедурі, ви передаєте назву таблиці ("table_name"), для якої ви хочете вимкнути (або включити) обмеження, разом із значенням enable_constraints. Процедура перебирає всі не системні обмеження для вказаної таблиці та включає або вимикає їх залежно від значення enable_constraints.

Приклад виклику цієї процедури:

-- Вимкнути всі не системні обмеження для таблиці "device"
CALL toggle_constraints(`device`, FALSE);

-- Включити всі не системні обмеження для таблиці "device"
CALL toggle_constraints(`device`, TRUE);

Цей спосіб дозволяє вимкнути (або включити) всі не системні обмеження для вказаної таблиці, а не окремих обмежень.

Відключення/включення обмежень (constraints) для всіх не системних таблиці в Postgresql 16

Для вимкнення (або включення) всіх не системних обмежень для всіх таблиць у схемі "public" в PostgreSQL, ви можете використовувати наступну храниму процедуру:

CREATE OR REPLACE PROCEDURE toggle_all_constraints(enable_constraints boolean)
LANGUAGE plpgsql
AS $$
DECLARE
    table_record record;
BEGIN
    -- Перебираємо всі таблиці в схемі "public"
    FOR table_record IN (SELECT table_name FROM information_schema.tables WHERE table_schema = `public` AND table_type = `BASE TABLE`)
    LOOP
        EXECUTE `CALL toggle_constraints(``` || table_record.table_name || ```, ` || enable_constraints || `)`;
    END LOOP;
END;
$$;

В даній процедурі, ми викликаємо попередню храниму процедуру toggle_constraints для кожної таблиці в схемі "public". Параметр enable_constraints передається внутрішній процедурі, щоб вимкнути або включити обмеження для кожної таблиці.

Процедура toggle_all_constraints перебирає всі таблиці в схемі "public" та викликає toggle_constraints для кожної таблиці, включаючи обмеження в залежності від значення enable_constraints.

Приклад виклику цієї процедури:

-- Вимкнути всі не системні обмеження для всіх таблиць у схемі "public"
CALL toggle_all_constraints(FALSE);

-- Включити всі не системні обмеження для всіх таблиць у схемі "public"
CALL toggle_all_constraints(TRUE);

Цей спосіб дозволяє вимкнути (або включити) всі не системні обмеження для всіх таблиць у схемі "public". Будьте обережні при вимиканні обмежень, оскільки це може призвести до порушення цілісності даних. Завжди робіть резервне копіювання даних перед виконанням подібних операцій.

Вимикання/вмикання всіх обмежень в базі даних

Для створення хранимої процедури, яка може вимикати та включати обмеження (constraints) в PostgreSQL, ви можете створити дві окремі версії процедури: одну для вимикання та іншу для включання обмежень. Ось приклад такої пари хранимих процедур:

1. Хранима процедура для вимикання обмежень:

CREATE OR REPLACE PROCEDURE disable_constraints()
LANGUAGE plpgsql
AS $$
BEGIN
    -- Вимикаємо всі обмеження в базі даних
    EXECUTE `ALTER TABLE ALL DISABLE TRIGGER ALL`;
END;
$$;

2. Хранима процедура для включання обмежень:

CREATE OR REPLACE PROCEDURE enable_constraints()
LANGUAGE plpgsql
AS $$
BEGIN
    -- Включаємо всі обмеження в базі даних
    EXECUTE `ALTER TABLE ALL ENABLE TRIGGER ALL`;
END;
$$;

Перша процедура disable_constraints вимикає всі обмеження, використовуючи ALTER TABLE ALL DISABLE TRIGGER ALL. Друга процедура enable_constraints включає всі обмеження за допомогою ALTER TABLE ALL ENABLE TRIGGER ALL.

Викликайте ці процедури згідно потреби, щоб вимикати та включати обмеження в базі даних. Наприклад:

-- Вимкнути обмеження
CALL disable_constraints();

-- Включити обмеження
CALL enable_constraints();

Будьте обережні при вимиканні обмежень, оскільки це може призвести до порушення цілісності даних. Завжди робіть резервне копіювання даних перед виконанням таких операцій.

Автор: Рудюк С.А. 2023. K2 Cloud ERP.