Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / представление / 13 сообщений из 13, страница 1 из 1
29.12.2013, 19:54:07
    #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
29.12.2013, 20:36:16
    #38515469
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
представление
Grime93нужно сделать его обновляемым.
Для этого достаточно написать триггеры на INSERT, UPDATE, DELETE, в которых и изменять
подлежащие таблицы согласно приведённым тобой правилам.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.12.2013, 20:40:16
    #38515472
Grime93
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
представление
можно это как то наглядно продемонстрирвовать?а то если честно,я не очень понял.
...
Рейтинг: 0 / 0
29.12.2013, 20:46:26
    #38515478
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
представление
Grime93можно это как то наглядно продемонстрирвовать?а то если честно,я не очень
понял.
Читай Language Reference на предмет CREATE TRIGGER.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.12.2013, 15:01:10
    #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
30.12.2013, 15:16:12
    #38515927
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
представление
Grime93вопрос в том,как можно его облегчить?
Задание не надо облегчать, сдавай как есть. Но запомни: в реальной жизни за такое увольняют.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.12.2013, 20:38:35
    #38516218
Grime93
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
представление
во первых:это мой первый опыт,во вторых:вам виднее,за что увольняют ;)
...
Рейтинг: 0 / 0
30.12.2013, 20:48:29
    #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
30.12.2013, 20:49:36
    #38516225
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
представление
Да, и еще: НИКОГДА не надейтесь, что триггером можно обеспечить уникальность в справочнике по какому-то полю. Это так, на будущее.
...
Рейтинг: 0 / 0
30.12.2013, 21:03:53
    #38516233
Grime93
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
представление
ох,знать бы ещё как это применить.
...
Рейтинг: 0 / 0
30.12.2013, 21:13:50
    #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
30.12.2013, 21:14:59
    #38516239
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
представление
но таки http://www.ibase.ru/v6/doc/datadef.zip к прочтению обязательно.
...
Рейтинг: 0 / 0
30.12.2013, 21:21:19
    #38516242
Grime93
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
представление
благодарствую)
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / представление / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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