Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / DISABLE TRIGGER ALL / 6 сообщений из 6, страница 1 из 1
04.09.2008, 17:27
    #35523121
H.A.M.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISABLE TRIGGER ALL
Привет.
В документации по PostgreSQL вскользь упоминается:
дока
ALL
Disable or enable all triggers belonging to the table. (This requires superuser privilege if any of the triggers are for foreign key constraints.)
Как понял я, если я это выполню - то отключу все триггеры на таблице, в том числе системные, которые обеспечивают выполнение ограничений целостности для FKs? Если это так, то я смогу
сделать вставку данных в нужные мне таблицы, даже если FK будет нарушен. Однако это не срабатывает, я постоянно получаю ошибки в стиле:
Код: plaintext
1.
psql:c_lookup1.sql: 20 : ERROR:  insert or update on table "c_lookup1" violates foreign key constraint "fk_clookup1_clookup2"
DETAIL:  Key (id)=( 1 ) is not present in table "c_lookup2".
Все дело в том, что таких инсертов много, я не хочу путаться между ними и выискивать зависимости и правильную последовательность вставки. Я хочу все вставить, а уже потом проверить. В Oracle вопрос решался путем disable/enable constraints. Здесь я хотел зделать так же, но не получается. Можно ли все FK отключить на время?

Если же нельзя, то ничего если в моей базе все constraint'ы будут deffered? Это ничем не грозит в будущем?
...
Рейтинг: 0 / 0
04.09.2008, 17:28
    #35523124
H.A.M.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISABLE TRIGGER ALL
PS: Версия PostgreSQL: 8.3.
...
Рейтинг: 0 / 0
04.09.2008, 17:49
    #35523203
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISABLE TRIGGER ALL
авторThis requires superuser privilege if any of the triggers are for foreign key constraints.

Вы уверены что делаете
Код: plaintext
alter table c_lookup1 disable trigger all
с правами суперпользователя ?


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
04.09.2008, 18:29
    #35523320
H.A.M.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISABLE TRIGGER ALL
да, 100%. Все равно не работает.

Я подумал и решил сделать все FK deferrable initially immediate, а перед заливкой данных set constraints deferred - а после set constraints immediate.
Думаю, мне этого будет достаточно - но все равно не нравиться такой подход.
...
Рейтинг: 0 / 0
05.09.2008, 13:15
    #35524512
iz
iz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISABLE TRIGGER ALL
Вы нашли правильный метод. DISABLE TRIGGER ALL не отключает системные триггеры, поэтому при необходимости рекомендуется делать в транзакции SET CONSTRAINTS ALL DEFERRED и ограничения целостности у вас будут проверяться в момент COMMIT. Обратный SET можно не делать, так как настройка работает только в течение транзакции.
...
Рейтинг: 0 / 0
05.09.2008, 15:19
    #35524896
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISABLE TRIGGER ALL
поддерживаю, через deferred - правильно

но disable triger all таки отключает и системные тригеры (если выполнять эту команду от администратора):
Код: 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.
seb=# create table c(id serial primary key);
NOTICE:  CREATE TABLE создаст подразумеваемую последовательность "c_id_seq" для serial-колонки "c.id"
NOTICE:  CREATE TABLE / PRIMARY KEY создаст подразумеваемый индекс "c_pkey" для таблицы "c"
CREATE TABLE

seb=# create table d(id serial primary key, c_id int references c);
NOTICE:  CREATE TABLE создаст подразумеваемую последовательность "d_id_seq" для serial-колонки "d.id"
NOTICE:  CREATE TABLE / PRIMARY KEY создаст подразумеваемый индекс "d_pkey" для таблицы "d"
CREATE TABLE

seb=# insert into d values (default,  0 );
ERROR:  insert or update on table "d" violates foreign key constraint "d_c_id_fkey"
DETAIL:  Ключ (c_id)=( 0 ) отсутствует в таблице "c".

seb=# alter table d disable trigger all;
ALTER TABLE

seb=# insert into d values (default,  0 );
INSERT  0   1 

seb=# select * from d;
 id | c_id
----+------
   2  |     0 
( 1  запись)

seb=# alter table d enable trigger all;
ALTER TABLE

seb=# insert into d values (default,  0 );
ERROR:  insert or update on table "d" violates foreign key constraint "d_c_id_fkey"
DETAIL:  Ключ (c_id)=( 0 ) отсутствует в таблице "c".

ps 8.3.3


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / DISABLE TRIGGER ALL / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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