Обновляемый вид SQL с объединенными таблицами

У меня есть мнение, которое выглядит примерно так,

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 ответа

Решение

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

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

Msg 4405, Level 16, State 1, Line 7
View or function 'v_ViewName' is not updatable because the modification affects multiple base tables.

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

Главное правило

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

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

УДАЛИТЬ Правило

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

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

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

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

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

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

В моем случае это была таблица, а не представление, но мне нужно было найти идентификатор схемы, которая ссылалась на таблицу в конструкции данных в справочной таблице, скажем, под названием 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

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

Другие вопросы по тегам