Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-4566
Gamar
2002-11-11 16:05
2002.12.02
...


3-4260
mv
2002-11-14 22:49
2002.12.02
удалённая база данных


14-4570
Yakudza
2002-11-11 16:02
2002.12.02
Как трафик посчитать.


7-4650
Evolution Q
2002-09-27 15:05
2002.12.02
Помогите с отключением мыши!


1-4444
BALU1111
2002-11-20 10:34
2002.12.02
Компиляция программы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский