Обновляемое представление SQL с объединенными таблицами - PullRequest
12 голосов
/ 02 сентября 2011

У меня есть представление, похожее на это,

SELECT  dbo.Staff.StaffId, dbo.Staff.StaffName, dbo.StaffPreferences.filter_type
FROM    dbo.Staff LEFT OUTER JOIN
        dbo.StaffPreferences ON dbo.Staff.StaffId = dbo.StaffPreferences.StaffId

Я пытаюсь обновить StaffPreferences.filter_type, используя,

UPDATE vw_Staff SET filter_type=1 WHERE StaffId=25

Я прочитал это в статье MSDN,

Любые модификации, включая операторы UPDATE, INSERT и DELETE, должны ссылаться на столбцы только из одной базовой таблицы.

Означает ли это, что я могу обновлять только поля вdbo.Staff (это все, чего я сейчас могу достичь). В этом контексте определение «базовой таблицы» не распространяется ни на какие последующие объединенные таблицы?

Редактировать : Это MS SQL

Ответы [ 4 ]

12 голосов
/ 02 сентября 2011

Ваше утверждение должно работать очень хорошо, так как вы изменяете только столбцы из одной таблицы (StaffPreferences).

Если вы попытаетесь обновить столбцы из разных таблиц в одном и том же операторе обновления, вы получите ошибку.

Msg 4405, Level 16, State 1, Line 7
View or function 'v_ViewName' is not updatable because the modification affects multiple base tables.
5 голосов
/ 02 сентября 2011

Правила для обновляемых представлений объединения следующие:

Общее правило

Любая операция INSERT, UPDATE или DELETE в представлении объединения может быть измененатолько одна базовая базовая таблица за раз.

Правило ОБНОВЛЕНИЯ Все обновляемые столбцы представления объединения должны соответствовать столбцам таблицы, сохраненной ключом.См. «Таблицы с ключами» для обсуждения таблиц с ключами.Если представление определено с помощью условия WITH CHECK OPTION, то все столбцы соединения и все столбцы повторяющихся таблиц не подлежат обновлению.

Правило DELETE

Строки изПредставление объединения может быть удалено, если в соединении имеется ровно одна таблица с сохранением ключей.Если представление определено с помощью предложения WITH CHECK OPTION и таблица, сохраненная на ключе, повторяется, то строки нельзя удалить из представления.

Правило INSERT Оператор INSERT не должен явно илинеявно ссылаются на столбцы неключевой сохраненной таблицы.Если представление соединения определено предложением WITH CHECK OPTION, операторы INSERT не допускаются.

http://download.oracle.com/docs/cd/B10501_01/server.920/a96521/views.htm#391

0 голосов
/ 05 июня 2015

Вот как я это решил.

В моем случае это была таблица, а не представление, но мне нужно было найти идентификатор схемы, которая ссылалась на таблицу в конструкции данных в справочной таблице, скажем, под названием our_schema.

Я запустил следующее:

select schemaid from our_schema where name = "MY:Form"

Это дало мне идентификатор как 778 (пример)

Затем я посмотрел, где этот идентификатор показывался с префиксом T, B или H.

В нашем случае у нас есть таблицы Table, Base и History, в которых хранятся данные.

Затем я запустил:

delete from T778
delete from B778
delete from H778

Это позволило мне удалить данные и обойти это ограничение.

0 голосов
/ 02 сентября 2011

Я думаю, вы можете увидеть некоторые проблемы, которые могут возникнуть, если в Staff есть строка с StaffId 25, но в StaffPreferences нет соответствующей строки. Есть несколько правильных вещей, которые вы могли бы сделать (сохранить вид, что это таблица, выполнить вставку в StaffPreferences; отклонить обновление и т. Д.).

Я думаю, что на этом этапе ядро ​​SQL Server не будет работать, и вам придется написать триггер, который реализует желаемое поведение (каким бы оно ни было. Вам нужно рассмотреть все случаи для работы объединения / не работает)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...