Форум: "Базы";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
ВнизТриггеры и целостность данных в IB Найти похожие ветки
← →
AlexA (2002-11-12 13:14) [0]Можно ли организововать проверку целостности триггерами, например
На не Null"евое значение, на уникальность и т.д.
Недавно уэнал что триггеры выполняются в рамках транзакции и поэтому возможны ошибки при прверке целостности...
Так ли это?
Спасибо.
← →
Victor_Cr (2002-11-12 13:47) [1]Можно ли организововать проверку целостности триггерами, например
На не Null"евое значение, на уникальность и т.д.
if new.FieldName1 is null then DoSomething1
if new.FieldName2 is null then DoSomething2
if new.FieldName3 is null then DoSomething3
...
if new.FieldNameN is null then DoSomethingN
Но уникальность прийдеться забивать в саму таблицу (первичный ключ, генератор и др.)
Недавно уэнал что триггеры выполняются в рамках транзакции и поэтому возможны ошибки при прверке целостности...
Так ли это?
Транзакции и предназначены для поддержания целостности данных. И если триггер не отработает или вернет ошибку, то отвергнеться вся транзакция. И не какой ошибки в данные не попадет.
← →
Alexandr (2002-11-12 13:54) [2]попадет.
Именно потому, что триггеры в контексте транзакции в отличие от индексов.
Примеры нужны?
← →
KDS (2002-11-12 13:58) [3]Не совсем понятен вопрос
"На не Null"евое значение:"
CREATE TRIGGER "detail_position_book_BI" FOR "detail_position_book"
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW."cod" IS NULL) THEN
NEW."cod" = GEN_ID("GEN_detail_position_book_ID",1);
END
"на уникальность" я делаю процедурой так:
CREATE PROCEDURE "add_to_DNB" (
"pSklCod" VARCHAR(30),
"pmak" VARCHAR(30),
"pgr" VARCHAR(30),
"pcat" VARCHAR(50))
RETURNS (
"ok" INTEGER)
AS
DECLARE VARIABLE "v_gr" INTEGER;
DECLARE VARIABLE "v_cat" INTEGER;
DECLARE VARIABLE "v_mak" INTEGER;
DECLARE VARIABLE "PresentDNB" INTEGER;
*************
SELECT "cod" FROM "detail_number_book"
WHERE ("dn_number"=:"pSklCod" and "dn_maker"=:"v_mak")
INTO :"PresentDNB";
IF (EXISTS(SELECT "cod" FROM "detail_number_book"
WHERE ("dn_number"=:"pSklCod" and "dn_maker"=:"v_mak")))
THEN "ok" = "PresentDNB";
ELSE BEGIN
INSERT INTO "detail_number_book" ("dn_number", "dn_maker",
"dn_category", "dn_groups")
VALUES (:"pSklCod",:"v_mak",:"v_cat",:"v_gr");
"ok" = 0;
END
Это 3 диалект FireBird(IB)
Т.е. перед тем как вставить запись я проверяю ее уникальность.
Если такой еще нет, то вставляю, иначе возвращаю код имеющейся.
← →
AlexA (2002-11-12 14:14) [4]Спасибо всем.
>Alexandr
Да поясни. Я думал также как и Victor_Cr и делаю примерно тоже что и KDS только в триггере. Victor_Cr он и я не правы?
← →
Alexandr (2002-11-12 14:38) [5]1) началась транзакция 1
2) Вставили значение в транзакции 1
3) Начали транзакцию 2
4) Вставили ТОЖЕ значение в транзакции 2 ( в этой транзакции еще не видно значения , вставленного в транзакции1 т.к. транзакция 1 не закоммичена) Проверка в триггере покажет, что значение уникальное
5) Закоммитили транзакцию 1
6) Закоммитили транзакцию 2
Все. Имеем в базе 2 совершенно одинаковых значения, несмотря на то, что пытались сделать проверку на уникальность на триггерах.
Для других случаев аналогично
← →
AlexA (2002-11-13 20:38) [6]> 2Alexandr
ДА ... Дела В самом деле.
А если кешировать? Попробовал вроде работает. Или все равно?
← →
evgeg (2002-11-13 22:10) [7]Тригеры придуманы специально, чтобы обеспечивать целостность.
Но уникальность значений они не могут обеспечить.
← →
Alexandr (2002-11-14 06:12) [8]кто сказал, что на триггерах можно обеспечить целостность foreign Key?
Нахрена я тут тогда вообще распинался?
Кого кэшировать-то? Что работает?
Бред все это...
← →
AlexA (2002-11-15 00:20) [9]>3 Alexandr
Не ругайся... :-)
Я задавал вопрос ответ я получил от тебя. В ответе я не сомневаюсь. Остались только маленькие вопрсики.
Если использовать IBQuery св-во cachedUpdate приравнять True.
Тогда метод POST не вносит изменения в таблицу,
Видимо вопрос сводиться к следущему при ApplyUpdate изменения перносятся в таблицу или как.
Если да, то между ApplyUpdate и Commit возможно вставить ошибочные данные, если нет ( что врятли) то работать можно и так.
В любом случае от использования триггеров для обеспечения целостности foreign Key я откажусь.
Спасибо , с уважением
Ты все внятно об я понял, что нельзя...
Осталось только любопытство. При кешировании изменений на стороне клиента, что происходит
например
← →
Alexandr (2002-11-15 06:57) [10]да ничего при кэшировании не происходит. Все тоже самое.
Просто изменения в базу пойдут пучком и централизованно.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c