Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Как обнаружить зависимость view от constraint?  [new]
Безенчук
Member

Откуда:
Сообщений: 9
Добрый день!

Создаю таблицу, имеющую ограничение в виде первичного ключа:
CREATE TABLE t_table (id integer NOT NULL GENERATED ALWAYS AS IDENTITY, part_number integer NOT NULL);
ALTER TABLE t_table ADD CONSTRAINT t_table_pkey PRIMARY KEY (id);

Потом создаю представление, основанное на этой таблице. Важный момент - в представлении используется группировка по первичному ключу исходной таблицы:
CREATE VIEW t_view AS (SELECT id, part_number FROM t_table WHERE part_number BETWEEN 1 AND 100 GROUP BY id);

В таблице pg_constraint появляется одна запись об ограничении, относящаяся к таблице t_table:
SELECT conrelid::regclass::text,conindid::regclass::text from pg_constraint where conname='t_table_pkey';
 conrelid |   conindid   
----------+--------------
 t_table  | t_table_pkey
(1 row)

Если я пытаюсь удалить это ограничение из таблицы, то Postgres мне сообщает, что представление t_view зависит от этого же ограничения:
ALTER TABLE t_table DROP CONSTRAINT t_table_pkey;
ERROR:  cannot drop constraint t_table_pkey on table t_table because other objects depend on it
DETAIL:  view t_view depends on constraint t_table_pkey on table t_table
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

Подскажите, пожалуйста, в каких объектах системного каталога можно увидеть связь между t_view и t_table_pkey?
25 мар 21, 17:53    [22299998]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить зависимость view от constraint?  [new]
Павел Лузанов
Member

Откуда:
Сообщений: 786
Зависимости между объектами хранятся в pg_depend.

Если поколдовать с запросами к этой таблице, то можно найти, что от ограничения t_table_pkey зависит правило перезаписи в pg_rewrite. Это правило перезаписи является правилом ON SELECT для представления t_view и в свою очередь зависит от самого представления.
26 мар 21, 10:22    [22300229]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить зависимость view от constraint?  [new]
Безенчук
Member

Откуда:
Сообщений: 9
Павел Лузанов, спасибо, поколдую!

Экспериментируя с созданием представлений на основе таблицы t_table, обнаружил, что если представление будет создано без группировки по первичному ключу исходной таблицы:
CREATE VIEW t_view_2 AS (SELECT id, part_number FROM t_table WHERE part_number BETWEEN 1 AND 100);
, то ограничение удаляется без проблем:
ALTER TABLE t_table DROP CONSTRAINT t_table_pkey;
ALTER TABLE

Почему GROUP BY во view создаёт зависимость между ограничением таблицы и представлением? Получается, что в случае отсутствия в таблице CONSTRAINT'а на основе PRIMARY KEY, процесс группировки, в ходе наполнения view данными, мог бы столкнуться с неуникальными значениями в столбце id?
28 мар 21, 09:48    [22300997]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить зависимость view от constraint?  [new]
Павел Лузанов
Member

Откуда:
Сообщений: 786
Вот что получается.
CREATE VIEW t_view AS (SELECT id, part_number FROM t_table WHERE part_number BETWEEN 1 AND 100 GROUP BY id);

На мой взгляд, постгрес имеет полное право не создавать представление в таком виде, а просто выдать ошибку. Ведь столбец part_number не может входить в список SELECT не находясь в GROUP BY. В списке SELECT к нему нужно обязательно групповую функцию применять. Попробуйте выполнить запрос отдельно.

Но постгрес догадался, что группировка выполняется по столбцу первичного ключа, т.е. по сути группировка не нужна. Ведь если все значения id уникальные, то и группировать нечего. А это значит что запрос можно выполнить и в таком виде, но нужно быть уверенным, что id всегда уникальные. Такую уверенность реализовали через зависимость представления от ограничения первичного ключа. Пока ограничение есть, можно обращаться к представлению.

Но зачем выполнять GROUP BY по столбцу первичного ключа - это вопрос не к постгресу, а к авторам запроса.
29 мар 21, 11:31    [22301330]     Ответить | Цитировать Сообщить модератору
 Re: Как обнаружить зависимость view от constraint?  [new]
Безенчук
Member

Откуда:
Сообщений: 9
Павел Лузанов, спасибо!
29 мар 21, 11:37    [22301337]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить