Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Архив / 7 сообщений из 7, страница 1 из 1
29.09.2006, 01:59
    #34020622
hexley
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Архив
Имеем таблицу с категориями
id parent_id .... type_view

Задача:
При DELETE помещать в категорию в архив... тоесть изменять type_view с 1 на 2
Пытался при помощи Rule на Delete, но не получилось , если я захочу просто удалить запись физически - не смогу (не смог по крайней мере)(к тригерам не притрагивался , поскольку из документации ничего не понял (понял конечно но конкретного ничего) с английским у меня проблемы )

Пришлось делать по старинке ,
если функции ( Parser3 ) передавать параметр force то удаляеться , если не передовать - то старый добрый
UPDATE categories SET type_view WHERE id=....

Появилась другая проблема...
У меня на таблице Foreign key - primary_id на id CASCADE.
Сделано это для того чтобы при удалении категории удалялись все дочерние...
Поставил еще один Foreign key primary_id на id + type_view на type_view ,
сделано ( как я думал ) для того чтобы при изменении type_view менялись все дочерние type_view (помещение всех дочерних категорий в архив)...

Не учел одного ...
Начальная категория (Корневая категория) у всех одна и таже тобиш id=0 parent_id=0 type_view=1
и по правилу ключа при изменнии type_view вылетает ошибка....

Люди!
Второй день мучаюсь , не сплю...
Подскажите как сделать , лучше через тригер (но с условием чтобы можно было бы удалить запись физически а не только поместить в архив), но если не поможете с тригером или Rule то скажите как все дочерние категории помещать в архив....


P.S.
Подскажите :
Что такое индекс BTREE и что такое RESTRICT...
P.P.S
Если поможете могу даже опустошить и дать 1 WMZ
Очень срочно надо разобраться...
Я новичек в постгресе , а книгу по нему никак купить пока не могу
...
Рейтинг: 0 / 0
29.09.2006, 10:06
    #34021028
Seeker2K
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Архив
что мешает корневой parent_id прировнять например к -1 ?
...
Рейтинг: 0 / 0
29.09.2006, 11:19
    #34021352
hexley
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Архив
Вы не поняли проблемы...
ну прировняю я parent_id к 1 а id к 2...
postgresql ругнеться на fk , мол записи с id 0 нету
...
Рейтинг: 0 / 0
29.09.2006, 14:30
    #34022312
mozheyko_d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Архив
hexleyВы не поняли проблемы...
ну прировняю я parent_id к 1 а id к 2...
postgresql ругнеться на fk , мол записи с id 0 нету
Ставьте NULL
...
Рейтинг: 0 / 0
29.09.2006, 16:01
    #34022772
.gc
.gc
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Архив
Код: plaintext
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.
85.
86.
87.
88.
89.
begin;
create table smth (
  id serial primary key,
  parent_id int references smth(id) on delete cascade on update cascade,
  data text,
  type_view int not null,
  unique (id, type_view),
  constraint  smth_acrh_cascade_fkey foreign key(parent_id, type_view) references smth(id, type_view) 
        on delete cascade on update cascade deferrable initially deferred
);
create function safe_mode() returns void as $$
BEGIN
        execute 'create rule dont_delete_but_arch AS ON DELETE TO smth DO INSTEAD update smth set type_view = 2 WHERE id = OLD.id';
        RETURN;
END$$ language 'plpgsql';
create function unsafe_mode() returns void as $$
BEGIN
        execute 'drop rule dont_delete_but_arch  ON smth';
        RETURN;
END$$ language 'plpgsql';

insert into smth values ( 0 ,  0 , 'text 1',  1 );
insert into smth values ( 1 ,  0 , 'text 2',  1 );
insert into smth values ( 2 ,  1 , 'text 2.1',  1 );
insert into smth values ( 3 ,  2 , 'text 2.1.1',  1 );
insert into smth values ( 4 ,  2 , 'text 2.1.2',  1 );
select * from smth;
select safe_mode();
delete from smth where id =  2 ;
select * from smth;
select unsafe_mode();
delete from smth where id =  2 ;
select * from smth;
select safe_mode();
delete from smth where id =  1 ;
select * from smth;

rollback;
---- результаты: 

 id | parent_id |    data    | type_view
----+-----------+------------+-----------
   0  |          0  | text  1      |          1 
   1  |          0  | text  2      |          1 
   2  |          1  | text  2 . 1    |          1 
   3  |          2  | text  2 . 1 . 1  |          1 
   4  |          2  | text  2 . 1 . 2  |          1 
(записей:  5 )

 safe_mode
-----------

( 1  запись)

DELETE  0 
 id | parent_id |    data    | type_view
----+-----------+------------+-----------
   0  |          0  | text  1      |          1 
   1  |          0  | text  2      |          1 
   2  |          1  | text  2 . 1    |          2 
   3  |          2  | text  2 . 1 . 1  |          2 
   4  |          2  | text  2 . 1 . 2  |          2 
(записей:  5 )

 unsafe_mode
-------------

( 1  запись)

DELETE  1 
 id | parent_id |  data  | type_view
----+-----------+--------+-----------
   0  |          0  | text  1  |          1 
   1  |          0  | text  2  |          1 
(записей:  2 )

 safe_mode
-----------

( 1  запись)

DELETE  0 
 id | parent_id |  data  | type_view
----+-----------+--------+-----------
   0  |          0  | text  1  |          1 
   1  |          0  | text  2  |          2 
(записей:  2 )



зы RTFM
...
Рейтинг: 0 / 0
29.09.2006, 16:45
    #34022993
hexley
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Архив
Спасибо!
Выручили
...
Рейтинг: 0 / 0
29.09.2006, 17:44
    #34023232
hexley
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Архив
А можно предложеный код довести до автоматизма?
тоесть без прямых вызовов функций
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Архив / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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