Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Прошу подсказки с FK / 8 сообщений из 8, страница 1 из 1
11.12.2014, 16:46
    #38831662
Любезный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу подсказки с FK
Приветствую уважаемых коллег.

Что-то совсем туплю. Разрабатываю простую базу и клиентское ПО к ней.
="DDL"
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
CREATE GENERATOR GENHISTRY;
CREATE GENERATOR GENMOVING;

CREATE TABLE HISTRIES(
  H_ID Integer NOT NULL,
  H_NUMBER Varchar(255) NOT NULL,
  H_YEAR Integer NOT NULL,
  H_BARCODE Varchar(100),
  PRIMARY KEY (H_ID));

CREATE TABLE MOVINGS(
  M_ID Integer NOT NULL,
  M_HISTRY Integer NOT NULL,
  M_DATE Date NOT NULL,
  M_SUM Smallint DEFAULT 1,
  M_COMMENT Blob sub_type 1,
  PRIMARY KEY (M_ID));

SET TERM ^ ;

CREATE TRIGGER DELHISTRY FOR HISTRIES
ACTIVE BEFORE DELETE POSITION 0
AS BEGIN
 DELETE FROM MOVINGS WHERE M_HISTRY=OLD.H_ID; 
END^

CREATE TRIGGER NEWHISTRY FOR HISTRIES 
ACTIVE BEFORE INSERT POSITION 0
AS BEGIN 
 NEW.H_ID=GEN_ID(GENHISTRY,1);
 INSERT INTO MOVINGS(M_HISTRY ,M_DATE, M_SUM, M_COMMENT)
 VALUES(NEW.H_ID, CAST('NOW' AS DATE), 1, 'Первичное поступление'); 
END^

CREATE TRIGGER NEWMOVING FOR MOVINGS 
ACTIVE BEFORE INSERT POSITION 0
AS BEGIN 
 NEW.M_ID=GEN_ID(GENMOVING,1);
END^

SET TERM ; ^

GRANT REFERENCES, SELECT ON CFG TO  ARCHIVE;
GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
 ON HISTRIES TO  ARCHIVE;
GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
 ON MOVINGS TO  ARCHIVE;


Пытаюсь впихнуть внешний ключ:
Код: sql
1.
2.
3.
4.
ALTER TABLE MOVINGS
 ADD CONSTRAINT FK_HISTRYID
 FOREIGN KEY (M_HISTRY)
 REFERENCES HISTRIES (H_ID);


При тестировании на вставке в HISTRY из клиентской программы получаю логичный баг:
Код: sql
1.
2.
3.
4.
5.
Violation of FOREIGN KEY constraint "".
Violation of FOREIGN KEY constraint "FK_HISTRYID" on table "MOVINGS".
Foreign key reference target does not exist.
Problematic key value is ("M_HISTRY" = 25520).
At trigger 'NEWHISTRY' line: 1, col: 99.


Никак не допру, как правильно организовать ссылочную целостность в такой базе. К одной HISTRY может быть привязано несколько MOVINGS. В поле MOVINGS.M_SUM клиент сажает значение 1 или -1. Прошу подсказки.
...
Рейтинг: 0 / 0
11.12.2014, 16:56
    #38831685
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу подсказки с FK
1. After trigger, а не before.
2. Старайся минимизировать скрипты.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.12.2014, 17:00
    #38831694
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу подсказки с FK
Любезный,

триггер у тебя before insert. от его начала и до конца никаких записей в histries нет.
NEW.H_ID=GEN_ID(GENHISTRY,1); - это никак не "вставка записи"

1. тебе не надо генерировать безусловно new.h_id
2. да и сомневаюсь, что надо дублировать вставку
...
Рейтинг: 0 / 0
11.12.2014, 17:05
    #38831707
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу подсказки с FK
ЛюбезныйCREATE TRIGGER NEWHISTRY FOR HISTRIES
ACTIVE BEFORE INSERT
AFTER
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.12.2014, 23:53
    #38831999
Любезный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу подсказки с FK
Спасибо за подсказки. Попробую подправить. Генерацию идентификаторов сделаю по условию на случай необходимости восстановления БД через скрипт; в триггере BEFORE INSERT оставлю только эту генерацию, а в триггере AFTER INSERT пропишу вставку записи в MOVINGS.
kdvда и сомневаюсь, что надо дублировать вставку
Вот тут не понял.
...
Рейтинг: 0 / 0
12.12.2014, 00:03
    #38832000
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу подсказки с FK
ЛюбезныйВот тут не понял.
это я не понял.
HISTRIES и MOVINGS связаны как 1:M. Т.е. мастер-деталь. Одной записи HISTRIES соответствует много записей в MOVINGS.
Что это за задача такая, в которой при появлении записи в H она тут же дублируется в M, да еще и с половиной пустых полей? Ладно бы M служила в роли какой-то истории изменений. Но тогда бы структура была другая.
Или это идея типа - в справочнике появился товар, и он тут же возник на складе в количестве 1 шт?

Хотя, лучше спросить об этом у людей, которые шарят в данной предметной области.
...
Рейтинг: 0 / 0
12.12.2014, 00:05
    #38832003
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу подсказки с FK
ЛюбезныйВот тут не понял.
Дублирование информации является нарушением одной из нормальных форм и применять его от
балды есть моветон.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.12.2014, 08:47
    #38832096
Любезный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу подсказки с FK
Объясню задачу.
HISTRY - это история (в смысле - документ). Программа с базой составляются для архива, где они хранятся, и служат для учета их движения. MOVINGS - таблица учета движения. История поступает - сразу же на нее заводится запись в HISTRIES, а в поле MOVINGS.M_SUM заносится 1 (в триггере). Если историю надо выдать - она находится в программе, и в MOVINGS создается новая запись с M_SUM=-1. Подобным образом прописывается возврат. Выдают их довольно редко, и по сумме M_SUM можно определить, есть история в архиве или нет. Вот как-то так.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Прошу подсказки с FK / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]