Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.02;
Скачать: CL | DM;

Вниз

Триггеры и целостность данных в 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
1-4423
dim-
2002-11-16 23:47
2002.12.02
Формы MDI


14-4613
Vikuksa
2002-11-12 17:34
2002.12.02
Люди кто-нить работал с AdvColumnGrid????


3-4194
Yazilimci
2002-11-13 15:11
2002.12.02
Dlya ADO


8-4517
diablo_al
2002-07-25 20:59
2002.12.02
TV-Tuner нужно добраться к ДУ


14-4630
sancho
2002-11-12 21:33
2002.12.02
Компакт НЕ ЧИТАЕТСЯ!!!