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

Сделать отображение обновляемым. Адрес должен задаваться идентификатором, строковое значение адреса игнорируется. При вводе данных, которые отсутствуют в справочниках, должна вызываться исключительная ситуация.
без справочников(birthday,nomer_doma,nomer_kvartiry)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE VIEW v_chel_spisok (id_adres1, familia, imia, otchestvo, birthday, adress)
AS
SELECT p.id_adres1, f.familia, i.imia, o.otchestvo, p.birthday, a_s.street||' '||a.nomer_doma||' '||a.nomer_kvartiry
FROM people p 
inner join fam_spr f on p.familia=f.ID_fam
inner join im_spr i on p.imia=i.ID_im
inner join otch_spr o on p.otchestvo=o.ID_otch
inner join adress a on p.id_adres1=a.ID_adr
inner join adres_stret a_s on a.street=a_s.ID_strr;
...
Рейтинг: 0 / 0
представление
    #38515469
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Grime93нужно сделать его обновляемым.
Для этого достаточно написать триггеры на INSERT, UPDATE, DELETE, в которых и изменять
подлежащие таблицы согласно приведённым тобой правилам.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
представление
    #38515472
Grime93
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
можно это как то наглядно продемонстрирвовать?а то если честно,я не очень понял.
...
Рейтинг: 0 / 0
представление
    #38515478
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Grime93можно это как то наглядно продемонстрирвовать?а то если честно,я не очень
понял.
Читай Language Reference на предмет CREATE TRIGGER.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
представление
    #38515908
Grime93
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в общем сделал я это геморойное задание, но вопрос в том,как можно его облегчить?подскажите.
Код: 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.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
create exception a 'Неверный ввод данных';

set term!!;

/* триггер на добавление */
CREATE TRIGGER ins_tr for v_chel_spisok
BEFORE INSERT
AS
DECLARE VARIABLE f_ID smallint;
DECLARE VARIABLE i_ID smallint;
DECLARE VARIABLE o_ID smallint;
BEGIN

IF(EXISTS(SELECT * from fam_spr f_s where f_s.familia=new.familia)
AND EXISTS(SELECT * from im_spr i_s where i_s.imia=new.imia)
AND EXISTS(SELECT * from otch_spr o_s where o_s.otchestvo=new.otchestvo)
AND EXISTS(SELECT * from adress ad where ad.ID_adr=new.id_adres1))
THEN
BEGIN

SELECT ID_fam from fam_spr f_s where f_s.familia=NEW.familia into :f_ID;
SELECT ID_im from  im_spr i_s where i_s.imia=NEW.imia into :i_ID;
SELECT ID_otch from otch_spr o_s where o_s.otchestvo=NEW.otchestvo into :o_ID;

INSERT INTO people(ID, familia, imia, otchestvo, birthday, id_adres1) values(null, :ID_fam, :ID_im, :ID_otch, new.birthday, new.id_adres1);
END
ELSE
exception a;
END!!


/* триггер на удаление */
CREATE TRIGGER del_tr for v_chel_spisok
BEFORE DELETE
AS
DECLARE VARIABLE fa1 smallint;
DECLARE VARIABLE im1 smallint;
DECLARE VARIABLE ot1 smallint;
BEGIN

SELECT ID_fam from fam_spr f_s where f_s.familia=OLD.familia into :fa1;
SELECT ID_im from  im_spr i_s where i_s.imia=OLD.imia into :im1;
SELECT ID_otch from otch_spr o_s where o_s.otchestvo=OLD.otchestvo into :ot1;

DELETE FROM people p where p.familia=:fa1
AND p.imia=:im1
AND p.otchestvo=:ot1
AND p.birthday=OLD.birthday
AND p.id_adres1=OLD.id_adres1;
END!!


/* триггер на изменение */
CREATE TRIGGER upd_tr for v_chel_spisok
BEFORE UPDATE
AS
DECLARE VARIABLE f_ID smallint;
DECLARE VARIABLE i_ID smallint;
DECLARE VARIABLE o_ID smallint;
DECLARE VARIABLE OLD_f_ID smallint;
DECLARE VARIABLE OLD_i_ID smallint;
DECLARE VARIABLE OLD_o_ID smallint;
BEGIN
IF(EXISTS(SELECT * from fam_spr f_s where f_s.familia=NEW.familia)
AND EXISTS(SELECT * from im_spr i_s where i_s.imia=NEW.imia)
AND EXISTS(SELECT * from otch_spr o_s where o_s.otchestvo=NEW.otchestvo)
AND EXISTS(SELECT * from adress ad where ad.ID_adr=NEW.id_adres1)) 
THEN
BEGIN

SELECT ID_fam from fam_spr f_s where f_s.familia=NEW.familia into :f_ID;
SELECT ID_im from  im_spr i_s where i_s.imia=NEW.imia into :i_ID;
SELECT ID_otch from otch_spr o_s where o_s.otchestvo=NEW.otchestvo into :o_ID;
SELECT ID_fam from fam_spr f_s where f_s.familia=OLD.familia into :OLD_f_ID;
SELECT ID_im from  im_spr i_s where i_s.imia=OLD.imia into :OLD_i_ID;
SELECT ID_otch from otch_spr o_s where o_s.otchestvo=OLD.otchestvo into :OLD_o_ID;
UPDATE people p set p.familia=:f_ID, p.imia=:i_ID, p.otchestvo=:o_ID, p.birthday=OLD.birthday 
AND p.id_adres1=old.id_adres1;
END
ELSE
exception a;
END!!

set term;!!

...
Рейтинг: 0 / 0
представление
    #38515927
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Grime93вопрос в том,как можно его облегчить?
Задание не надо облегчать, сдавай как есть. Но запомни: в реальной жизни за такое увольняют.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
представление
    #38516218
Grime93
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
во первых:это мой первый опыт,во вторых:вам виднее,за что увольняют ;)
...
Рейтинг: 0 / 0
представление
    #38516224
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Grime93При вводе данных, которые отсутствуют в справочниках, должна вызываться исключительная ситуация.Ваш триггер проверит наличие данных в соотв. справочниках, это так.
Но затем, после того как вы добавите запись в таблицу people, я влезу в любой из справочников, указанный тут:
Код: sql
1.
2.
3.
4.
IF(EXISTS(SELECT * from fam_spr f_s where f_s.familia=new.familia)
AND EXISTS(SELECT * from im_spr i_s where i_s.imia=new.imia)
AND EXISTS(SELECT * from otch_spr o_s where o_s.otchestvo=new.otchestvo)
AND EXISTS(SELECT * from adress ad where ad.ID_adr=new.id_adres1))

- и грохну там все строки.
И данные таблицы people - того, "ку-ку". Ссылаться будут на отсутствующие строки.

Так что применяйте нормальный метод (hint: Referential Integrity).
...
Рейтинг: 0 / 0
представление
    #38516225
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и еще: НИКОГДА не надейтесь, что триггером можно обеспечить уникальность в справочнике по какому-то полю. Это так, на будущее.
...
Рейтинг: 0 / 0
представление
    #38516233
Grime93
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ох,знать бы ещё как это применить.
...
Рейтинг: 0 / 0
представление
    #38516238
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
create table spravo4nik_4elov(id int primary key, fio varchar(100) not null);
commit;
create table people(id int primary key, id_4ela int, constraint people_FK_4elov foreign key(id_4ela) references spravo4nik_4elov(id));
commit;

и аналогично с другими справочниками.
...
Рейтинг: 0 / 0
представление
    #38516239
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но таки http://www.ibase.ru/v6/doc/datadef.zip к прочтению обязательно.
...
Рейтинг: 0 / 0
представление
    #38516242
Grime93
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
благодарствую)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / представление
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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