Представление 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
Это позволило мне удалить данные и обойти такое ограничение.