![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Триггеры и целостность данных в IB [D5, IB5.x]
AlexA © (2002-11-12 13:14:00)Можно ли организововать проверку целостности триггерами, например
На не Null"евое значение, на уникальность и т.д.
Недавно уэнал что триггеры выполняются в рамках транзакции и поэтому возможны ошибки при прверке целостности...
Так ли это?
Спасибо.
Alexandr (2002-11-15 06:57:00) [1]да ничего при кэшировании не происходит. Все тоже самое.
Просто изменения в базу пойдут пучком и централизованно.
AlexA (2002-11-15 00:20:00) [2]>3 Alexandr
Не ругайся... :-)
Я задавал вопрос ответ я получил от тебя. В ответе я не сомневаюсь. Остались только маленькие вопрсики.
Если использовать IBQuery св-во cachedUpdate приравнять True.
Тогда метод POST не вносит изменения в таблицу,
Видимо вопрос сводиться к следущему при ApplyUpdate изменения перносятся в таблицу или как.
Если да, то между ApplyUpdate и Commit возможно вставить ошибочные данные, если нет ( что врятли) то работать можно и так.
В любом случае от использования триггеров для обеспечения целостности foreign Key я откажусь.
Спасибо , с уважением
Ты все внятно об я понял, что нельзя...
Осталось только любопытство. При кешировании изменений на стороне клиента, что происходит
например
Alexandr (2002-11-14 06:12:00) [3]кто сказал, что на триггерах можно обеспечить целостность foreign Key?
Нахрена я тут тогда вообще распинался?
Кого кэшировать-то? Что работает?
Бред все это...
evgeg (2002-11-13 22:10:00) [4]Тригеры придуманы специально, чтобы обеспечивать целостность.
Но уникальность значений они не могут обеспечить.
AlexA (2002-11-13 20:38:00) [5]> 2Alexandr
ДА ... Дела В самом деле.
А если кешировать? Попробовал вроде работает. Или все равно?
Alexandr (2002-11-12 14:38:00) [6]1) началась транзакция 1
2) Вставили значение в транзакции 1
3) Начали транзакцию 2
4) Вставили ТОЖЕ значение в транзакции 2 ( в этой транзакции еще не видно значения , вставленного в транзакции1 т.к. транзакция 1 не закоммичена) Проверка в триггере покажет, что значение уникальное
5) Закоммитили транзакцию 1
6) Закоммитили транзакцию 2
Все. Имеем в базе 2 совершенно одинаковых значения, несмотря на то, что пытались сделать проверку на уникальность на триггерах.
Для других случаев аналогично
AlexA (2002-11-12 14:14:00) [7]Спасибо всем.
>Alexandr
Да поясни. Я думал также как и Victor_Cr и делаю примерно тоже что и KDS только в триггере. Victor_Cr он и я не правы?
KDS (2002-11-12 13:58:00) [8]Не совсем понятен вопрос
"На не 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)
Т.е. перед тем как вставить запись я проверяю ее уникальность.
Если такой еще нет, то вставляю, иначе возвращаю код имеющейся.
Alexandr (2002-11-12 13:54:00) [9]попадет.
Именно потому, что триггеры в контексте транзакции в отличие от индексов.
Примеры нужны?
Victor_Cr (2002-11-12 13:47:00) [10]Можно ли организововать проверку целостности триггерами, например
На не 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
Но уникальность прийдеться забивать в саму таблицу (первичный ключ, генератор и др.)
Недавно уэнал что триггеры выполняются в рамках транзакции и поэтому возможны ошибки при прверке целостности...
Так ли это?
Транзакции и предназначены для поддержания целостности данных. И если триггер не отработает или вернет ошибку, то отвергнеться вся транзакция. И не какой ошибки в данные не попадет.