powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как обнаружить зависимость view от constraint?
5 сообщений из 5, страница 1 из 1
Как обнаружить зависимость view от constraint?
    #40056964
Безенчук
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Создаю таблицу, имеющую ограничение в виде первичного ключа:
Код: sql
1.
2.
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);


Потом создаю представление, основанное на этой таблице. Важный момент - в представлении используется группировка по первичному ключу исходной таблицы:
Код: sql
1.
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:
Код: sql
1.
2.
3.
4.
5.
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 зависит от этого же ограничения:
Код: sql
1.
2.
3.
4.
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?
...
Рейтинг: 0 / 0
Как обнаружить зависимость view от constraint?
    #40057101
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зависимости между объектами хранятся в pg_depend .

Если поколдовать с запросами к этой таблице, то можно найти, что от ограничения t_table_pkey зависит правило перезаписи в pg_rewrite. Это правило перезаписи является правилом ON SELECT для представления t_view и в свою очередь зависит от самого представления.
...
Рейтинг: 0 / 0
Как обнаружить зависимость view от constraint?
    #40057509
Безенчук
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов, спасибо, поколдую!

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

, то ограничение удаляется без проблем:
Код: sql
1.
2.
ALTER TABLE t_table DROP CONSTRAINT t_table_pkey;
ALTER TABLE


Почему GROUP BY во view создаёт зависимость между ограничением таблицы и представлением? Получается, что в случае отсутствия в таблице CONSTRAINT'а на основе PRIMARY KEY, процесс группировки, в ходе наполнения view данными, мог бы столкнуться с неуникальными значениями в столбце id?
...
Рейтинг: 0 / 0
Как обнаружить зависимость view от constraint?
    #40057711
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что получается.
Код: sql
1.
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 по столбцу первичного ключа - это вопрос не к постгресу, а к авторам запроса.
...
Рейтинг: 0 / 0
Как обнаружить зависимость view от constraint?
    #40057717
Безенчук
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов, спасибо!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как обнаружить зависимость view от constraint?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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