Не удается обновить представление?

Мой сайт был разработан с использованием Drupal 6, работающего на сервере Postgresql 8.3 в Ubuntu 11.10. Также вебмин версии 1.590.

Теперь я хочу обновить записи в таблице, но когда я запускаю:

UPDATE uac_institution_view SET status = '2' WHERE nid = '9950'

это дает мне ошибку, например:

Не удалось выполнить SQL: SQL UPDATE uac_institution_view SET status = '2' WHERE nid = '9950' failed: ОШИБКА: невозможно обновить представление СОВЕТ: Вам необходимо безусловное правило ON UPDATE DO DO INSTEAD.

Проблема в том, что работают только SELECT запросы. команды UPDATE, INSERT и DELETE не работают; они терпят неудачу с вышеуказанной ошибкой.

Это проблема с разрешением? Синтаксическая ошибка? Что-то другое?


person srinu    schedule 31.10.2012    source источник
comment
Первое сообщение об ошибке совершенно ясно показывает, в чем проблема.   -  person Marc B    schedule 31.10.2012
comment
Вы читали мой пояснительный ответ о том, как предоставить достаточно информации, или совет на вики PostgreSQL, на которую он ссылался? Где выход psql \d? Версия PostgreSQL (1.590 не является версией PostgreSQL; используйте select version(), если сомневаетесь)? stackoverflow.com/a/13151381/398670 Как бы вы ответили на этот вопрос, если бы не У вас нет доступа к DDL для uac_institution_view? Кроме того, это сообщение об ошибке, отличное от того, которое вы давали ранее. Что изменилось?   -  person Craig Ringer    schedule 31.10.2012
comment
См. также stackoverflow.com/q/11664302/398670 и stackoverflow.com/questions/11681852/   -  person Craig Ringer    schedule 31.10.2012


Ответы (3)


Представления PostgreSQL по умолчанию не обновляются. Вы должны указать PostgreSQL, как вы хотите обновить представление.

Сделайте это, используя «безусловное правило ON UPDATE DO INSTEAD» (как сказано в сообщении об ошибке, которое вы вставили) или, что предпочтительнее, в PostgreSQL 9.1 и выше, используя триггер представления. Я предоставил ссылки на все это в мом ответе на ваш предыдущий пост, но вот еще немного информации:

Во многих случаях лучше оставить представление доступным только для чтения и просто обновить базовую таблицу. Поскольку вы не предоставили определение представления, трудно сказать, что это на самом деле означает. Обновите свой вопрос с выводом запуска \d uac_institution_view в psql и прокомментируйте, что вы это сделали; возможно, я могу указать способ запуска обновления непосредственно в базовой таблице (таблицах).

Вы используете очень устаревшую версию PostgreSQL (8.3), поэтому вы не можете использовать предпочтительный подход INSTEAD OF триггера, вы должны либо использовать правила, либо напрямую обновлять базовую таблицу.

person Craig Ringer    schedule 31.10.2012
comment
извините, мой плохой английский, и версия: PostgreSQL 8.3.8 на x86_64-pc-linux-gnu, скомпилированная GCC gcc-4.4.real (Ubuntu 4.4.1-3ubuntu3) 4.4.1, и вывод \d был: Failed для выполнения SQL: команда не поддерживается. Спасибо за ответ. - person srinu; 31.10.2012
comment
@srinu Твой английский лучше моего понимания твоего языка. Хорошо. Вы используете очень старую версию PostgreSQL, которую следует обновить как можно скорее. Он не поддерживает INSTEAD OF триггеры, поэтому вы должны использовать правила для реализации поддержки обновления в представлении или просто UPDATE непосредственно в базовой таблице. Я не могу показать вам, как это сделать, потому что вы до сих пор не предоставили определение представления! (Ответ обновлен) - person Craig Ringer; 31.10.2012
comment
Привет, сэр, я был новичком в postgresql db, как увидеть определение представления и как увидеть структуру таблицы. - person srinu; 31.10.2012
comment
@srinu Либо подключитесь к графической программе PgAdmin-III и просмотрите там представление/таблицу, либо (предпочтительно для переполнения стека) откройте инструмент командной строки psql, подключитесь к нужной базе данных и запустите \d view_or_table_name, затем скопируйте и вставьте вывод. См. postgresql.org/docs/current/interactive/app-psql.html. и postgresql.org/docs/current/interactive/tutorial.html . В какой-то момент вы можете подумать о том, чтобы нанять кого-нибудь, кто поможет вам обновить приложение и базу данных до текущей версии; см. postgresql.org/support/professional_support - person Craig Ringer; 31.10.2012
comment
Привет, сэр, я решил проблему, используя левое соединение, я обновил записи. В исходной таблице и представлении есть общее поле, поэтому с помощью соединений я решил проблему. - person srinu; 06.11.2012
comment
запрос таков: $query = выберите a.nid,a.status,a.editiontitle,a.uac_edition_details_editiontype,b.title из uac_institution_view в качестве узла LEFT JOIN как b на b.nid = a.nid, где a.status= '1' порядок по возрастанию a.uac_edition_details_editiontype, возрастанию a.editiontitle, возрастанию a.title; - person srinu; 06.11.2012
comment
Вы можете добавить, что, поскольку простые представления 9.3 автоматически обновляются: postgresql.org/docs/current/static/ - person a_horse_with_no_name; 22.10.2015

К вашему сведению, после публикации ответа, касающегося правил/триггеров, в PostgreSQL 9.3 появились автоматически обновляемые представления. Версия 9.3 находится в бета-версии 2 по состоянию на 27 июня 2013 г., поэтому она еще не общедоступна.

Вот пример: https://web.archive.org/web/20160322164044/http://michael.otacoo.com/postgresql-2/postgres-9-3-feature-highlight-auto-обновляемыепредставления/

person Jeff French    schedule 19.08.2013

Я использую postgres 9.5, и представления обновляются по умолчанию. Пример :

CREATE TABLE UP_DATE (id number, name varchar2(29));
insert into up_date values(1, 'Foo');
select * from up_date;
CREATE OR REPLACE VIEW UPDATE
AS
Select 
name from up_date;
select * from update;
insert into update values('Bar');
select * from update;

Выйдет ли Фу и Бар

person happybuddha    schedule 03.10.2016
comment
К вашему сведению. Если вы добавляете столбец с помощью CREATE OR REPLACE, новый столбец должен быть добавлен в конец списка выбранных столбцов. - person Nate Wanner; 10.01.2018
comment
Типы данных NUMBER и VARCHAR2 специфичны для Oracle — это должны быть NUMERIC и VARCHAR (n). Может быть, вы захотите это изменить? - person Vérace; 18.05.2019