Использование Postgresql.
Я пытаюсь использовать процедуру TRIGGER для проверки целостности INSERT.
Вопрос в том, ......
ли "ДО"INSERT FOR EACH ROW "можете убедиться, что каждая строка для вставки" проверена "и" вставлена "одна за другой?мне нужна дополнительная блокировка таблицы, чтобы выжить после одновременной вставки?
проверка на новую строку1 -> вставка строки1 -> проверка на новую строку 2 -> вставка строки2
--
--
-- unexpired product name is unique.
CREATE TABLE product (
"name" VARCHAR(100) NOT NULL,
"expired" BOOLEAN NOT NULL
);
CREATE OR REPLACE FUNCTION check_consistency() RETURNS TRIGGER AS $$
BEGIN
IF EXISTS (SELECT * FROM product WHERE name=NEW.name AND expired='false') THEN
RAISE EXCEPTION 'duplicated!!!';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_check_consistency
BEFORE INSERT ON product
FOR EACH ROW EXECUTE PROCEDURE check_consistency();
--
INSERT INTO product VALUES("prod1", true);
INSERT INTO product VALUES("prod1", false);
INSERT INTO product VALUES("prod1", false); // exception!
это нормально
name | expired
==============
p1 | true
p1 | true
p1 | false
Это не нормально
name | expired
==============
p1 | true
p1 | false
p1 | false
или, может быть, я должен спросить, как я могу использовать Trigger для реализации SQL "Primary" или "Unique".