SQL Updatable View со связанными таблицами

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

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 (и это все, чего я могу достичь в настоящее время). В этом контексте определение "базовой таблицы" не распространяется ни на какие последующие соединенные таблицы?

Ответ 1

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

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

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

Ответ 2

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

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

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

Правило UPDATE. Все обновляемые столбцы вида соединения должны отображаться на столбцы таблицы с сохранением ключа. См. "Таблицы с сохранением ключей" для обсуждение сохраненных ключей. Если представление определено с помощью 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#391

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

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

Затем я побежал:

delete from T778
delete from B778
delete from H778

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