Триггер или Процедура

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
day
Сообщения: 13
Зарегистрирован: 27 дек 2005, 15:21

Триггер или Процедура

Сообщение day » 26 мар 2006, 15:39

Пишу дипломную с помощью Interbase Как вам такая реализация БД
Есть таблица UHETMASHIN в которой бухгалтер вставляет все
записи о партий импортированных машин, также есть подчиненная
таблица MASHINA (которая будет связана посредством триггера,
потому что если на табл делаещь Constraint Foreign key невозможно
реализовать какие либо триггера на эту табл). Есть также таблица SKLAD
в которой как вы заметили дублируется информация из двух таблиц,
что совершенно противоречит теорий нормализаций БД, но такова логика
моей БД. Все бы отлично, но есть проблема. Нужно чтобы в SKLAD копировалась
некоторая информация из таблицы UHETMASHIN (а именно, AKTPRIEMKI),
и из табл MASHIN (а именно,MARKA ,KOLVO , PREIS, PRIM, FOTO). Попробовал с помощью
триггера After Delete, но он выдае ошибку, что программа не может выполнится так
как входные параметры не соответствуют выходным ,
то есть если копируещь данные с помощью After Delete, то таблицы по структуре
должны быть соверщенно одинаковы, вопрос как организовать
такое копирование отдельных полей?
Чере зпроцедуру или триггер?

Код: Выделить всё

CREATE TABLE UHETMASHIN                                                        // таблица учета Импортированных машин
 (KOD         INTEGER NOT NULL,                                                    // ключ таблицы
  DATAPRIEMKI DATE DEFAULT 'Now',                                         // дата приемки машин
  DEKLAR      BLOB SUB_TYPE 1 SEGMENT SIZE 120,                //Таможенные деклараций
  PREISALL    DOUBLE PRECISION,                                               //Вся цена импортированных машин(партий) 
  ZAKTK       BLOB SUB_TYPE 1 SEGMENT SIZE 120,                 // Заключение технической коммиссий
  AKTPRIEMKI  BLOB SUB_TYPE 1 SEGMENT SIZE 120,           // Акт приемки-передачи
  NDS         COMPUTED BY (PreisAll*0.16),                                    //НДС
  AKZIZ       COMPUTED BY (PreisAll*0.2),                                     //Акциз 
  PRIM        VARCHAR(30),                                                             // поле для примечания
  KOLVO       INTEGER,                                                                   // кол-во 
  SUMMA       COMPUTED BY (PREISALL*KOLVO));               // Сумма 



CREATE TABLE MASHINA                                                    // таблица Машин
(KODM  INTEGER NOT NULL,                                             // код машины
  KODUM INTEGER NOT NULL,                                           // код учета машин будет связано между таблицей UHETMASHIN  посредством                                                                                                       триггера, а не с помошью Constraint Foreign key
  MARKA VARCHAR(50),                                                      // марка машины
  PREIS DOUBLE PRECISION,                                             // Цена каждой машины 
  PRIM  VARCHAR(20),                                                           // поле для примечания
  FOTO  BLOB SUB_TYPE 0 SEGMENT SIZE 80);                  // фото машины



CREATE TABLE SKLAD                                                               //таблица склада машин
( KODS       INTEGER NOT NULL,                                               // ключ
  AKTPRIEMKI BLOB SUB_TYPE 1 SEGMENT SIZE 80,         // акт-приемки    дублируется с табл UHETMASHIN     
  KOLVO      INTEGER,                                                               // кол-во машин   дублируется с табл MASHINА 
  MARKA      VARCHAR(50),                                                     //марка машины    дублируется с табл MASHINА
  PREIS      DOUBLE PRECISION,                                             // Цена отдельной машины  дублируется с табл MASHINА
  PRIM       VARCHAR(20),                                                        //поле примечания   дублируется с табл MASHINА 
  FOTO       BLOB SUB_TYPE 0 SEGMENT SIZE 80);             // фото машины        дублируется с табл MASHINА

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 26 мар 2006, 16:33

которая будет связана посредством триггера,
потому что если на табл делаещь Constraint Foreign key невозможно
реализовать какие либо триггера на эту табл)
чего-чего?

andy_ax
Сообщения: 7
Зарегистрирован: 21 мар 2006, 14:31

Re: Триггер или Процедура

Сообщение andy_ax » 28 мар 2006, 07:00

согласен с kdv что фраза очень странная :)

и по моему тут все напутано с организацией базы :
- в триггере AfteDelete что либо копировать странно, в этом трриггере можно какие-нть проверки целостности данных после удаления делать

- слишком много полей с дублированим информации (особенно с блобами) говорит о странной логике построения базы

- а где в таблице UHETMASHIN ссылка на саму машину?
- если цена одной машины может быть различной в разных поставках то зачем ее указывать в таблице описания самой машины? ее надо писать в таблицу учета машин
- таблицы учета машин и склада (он обычно и занимается учетом товара :-) ) по моему имеют схожее назначение, зачем их две ?

ну это по моему так :-)

day
Сообщения: 13
Зарегистрирован: 27 дек 2005, 15:21

Триггер

Сообщение day » 31 мар 2006, 15:43

То что я написал это лищь шаблон БД Да согласен логика не то что надо я об этом писал. Но не это важно мне нужно , чтобы информация перемещалась (именно перемещалась, а не копировалась) из одной таблицы (в данном случае из таблицы учета машин в таблицу склад) в другую Насчет триггера я имел ввиду что, сс помошью After delete можно организоватть такое перемешение , но таблицыы должны быть совершенно одинаковыми по структуре . У моей БД она не одинакова и весь вопрос в том , как организовать перемешение таких столбцов. И Эту БД я придумал именно для этой цели. В Настояшей БД данные у меня не будут дубл-ся :!:

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 31 мар 2006, 17:04

напиши триггер before delete, он при наличии FK работает.
У моей БД она не одинакова и весь вопрос в том , как организовать перемешение таких столбцов.
я вот не понимаю таких вопросов, увы. в SQL есть 5 действий - select, insert, delete, update, execute. На таблицах есть триггеры, before/after, на действия ins/upd/del. Так что, вставить ("скопировать") запись при удалении - не проблема.

day
Сообщения: 13
Зарегистрирован: 27 дек 2005, 15:21

Сообщение day » 02 апр 2006, 12:18

Вот это я имел и ввиду как скопировать данные через триггер или процедуру если таблицы неодинаковы по структуре то есть если они одинаковы Афтер делете работает без проблем :?:

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 02 апр 2006, 13:44

как скопировать данные через триггер или процедуру если таблицы неодинаковы по структуре
я не врубаюсь, у тебя что, проблемы с синтаксисом оператора insert? в SQL нет понятия "копировать".
Как ты вообще там пишешь, что "одинаковые" можешь "скопировать", а разные - нет???

p.s. твой новый топик "Прога" удалил. Пиши здесь, по человечески.

Ответить