powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Прошу подсказки с FK
8 сообщений из 8, страница 1 из 1
Прошу подсказки с FK
    #38831662
Любезный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую уважаемых коллег.

Что-то совсем туплю. Разрабатываю простую базу и клиентское ПО к ней.
="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
Прошу подсказки с FK
    #38831685
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. After trigger, а не before.
2. Старайся минимизировать скрипты.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Прошу подсказки с FK
    #38831694
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любезный,

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

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

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


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