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

редактировать: это 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.

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

Общие Правила

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

обновить правило все обновляемые столбцы вида соединения должны сопоставляться с столбцы таблицы с сохраненным ключом. См. "Key-Preserved Tables" для a обсуждение ключевых таблиц. Если представление определено с С предложением CHECK OPTION, затем все столбцы join и все столбцы повторяющиеся таблицы не обновляются.

удалить правило

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

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

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


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

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


вот как я ее решал.

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

Я пробежал следующее:

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

Это дало мне ИД 778 (пример)

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

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

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

delete from T778
delete from B778
delete from H778

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