Trigirlarni o'chirib qo'yish
Ushbu qo'llanmada PostgreSQLda trigirlarni butunlay o'chirib tashlamasdan, ma'lumotlarni ommaviy yuklash (bulk insert) yoki texnik xizmat ko'rsatish davomida ularni vaqtincha to'xtatib qo'yish (DISABLE TRIGGER) va qayta yoqish (ENABLE TRIGGER) usullarini o'rganasiz.
Ba'zan katta hajmdagi ma'lumotlarni bazaga import qilish yoki ma'lumotlarni tozalash jarayonida trigirlar ishlashi unumdorlikni pasaytiradi yoki xatoliklarga olib kelishi mumkin. Bunday hollarda trigirni o'chirish shart emas — uni vaqtincha o'chirib qo'yish (disable) kifoya.
Sintaksisi:
ALTER TABLE table_name
DISABLE TRIGGER trigger_name | ALL;
Sintaksis tushuntirishi:
trigger_name — aynan bitta trigirni o'chirib qo'yadi.ALL — ko'rsatilgan jadvaldagi barcha foydalanuvchi trigirlarini vaqtincha o'chiradi.Ishlar tugagach, trigirlarni asl holatiga qaytarish uchun:
ALTER TABLE table_name
ENABLE TRIGGER trigger_name | ALL;
Avval narxlar o'zgarishini loglaydigan jadval va trigir yaratamiz:
DROP TABLE IF EXISTS price_change_logs CASCADE;
DROP TABLE IF EXISTS products CASCADE;
CREATE TABLE products (
product_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
price DECIMAL(11, 2) NOT NULL
);
CREATE TABLE price_change_logs (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
product_id INT NOT NULL,
old_price DECIMAL(11, 2) NOT NULL,
new_price DECIMAL(11, 2) NOT NULL,
changed_at TIMESTAMPTZ DEFAULT NOW(),
FOREIGN KEY (product_id) REFERENCES products (product_id) ON DELETE CASCADE
);
INSERT INTO products (product_name, price) VALUES
('Samsung Galaxy S24', 999.99),
('Apple iPhone 15', 899.99);
-- Trigir funksiyasi
CREATE OR REPLACE FUNCTION log_price_changes()
RETURNS TRIGGER
AS
$$
BEGIN
IF NEW.price <> OLD.price THEN
INSERT INTO price_change_logs (product_id, old_price, new_price)
VALUES (OLD.product_id, OLD.price, NEW.price);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Trigir
CREATE TRIGGER price_update_trigger
AFTER UPDATE OF price ON products
FOR EACH ROW
EXECUTE FUNCTION log_price_changes();
UPDATE products
SET price = 799.99
WHERE product_id = 1;
Log jadvalini tekshiramiz:
SELECT product_id, old_price, new_price FROM price_change_logs;
Natija:
product_id | old_price | new_price
------------+-----------+-----------
1 | 999.99 | 799.99
Trigir ishladi va narx o'zgarishini saqladi.
Endi ommaviy tuzatish kiritishimiz kerak bo'lib, log yozilishini xohlamaymiz:
ALTER TABLE products
DISABLE TRIGGER price_update_trigger;
Endi 2-mahsulot narxini o'zgartiramiz:
UPDATE products
SET price = 999.99
WHERE product_id = 2;
Log jadvalini qayta tekshiramiz:
SELECT product_id, old_price, new_price FROM price_change_logs WHERE product_id = 2;
Natija:
product_id | old_price | new_price
------------+-----------+-----------
(0 rows)
Trigir o'chirilgani sababli logga hech narsa yozilmadi!
Jadvaldagi barcha trigirlarni bir vaqtda to'xtatish:
ALTER TABLE products
DISABLE TRIGGER ALL;
Amallar yakunlangach, trigirni qayta faollashtiramiz:
ALTER TABLE products
ENABLE TRIGGER price_update_trigger;
Yoki hammasini bir vaqtda:
ALTER TABLE products
ENABLE TRIGGER ALL;
DISABLE TRIGGER vaqtinchalik import, eksport yoki migratsiya jarayonlarida trigirni o'chirmasdan turib to'xtatib turish uchun juda qulay.ENABLE TRIGGER trigir faoliyatini asl holiga qaytaradi.ALL kalit so'zi jadvaldagi barcha trigirlarga birgalikda ta'sir qiladi.