Как определить, какие таблицы в множественном представлении являются обновляемыми? - PullRequest
1 голос
/ 19 мая 2009

Обновление: у меня проблема не с сервером SQL. Я выполнил оператор обновления внутри базы данных вручную для представления и смог обновить таблицу Bar. Я закрою это и более подробно изучу адаптеры OleDbDataAdapters, поскольку думаю, что проблема в них.

Этот вопрос относится к MS SQL Server 2000. Как определить, какую таблицу в множественном представлении можно изменить?

У меня есть следующий вид:

CREATE VIEW dbo.MyView
AS
SELECT     dbo.Foo.Id, dbo.Bar.Id, dbo.Foo.column1, dbo.Foo.column2,
           dbo.Foo.column3, dbo.Bar.column1, dbo.Bar.column2, 
           dbo.Bar.column3
FROM       dbo.Bar INNER JOIN
                  dbo.Foo ON dbo.Bar.Id = dbo.Foo.ForeignId

Когда я обновляю это представление (используя VB.NET OleDbDataAdapters), я могу обновить столбцы Foo, но не столбцы Bar. Мои исследования показали, что в таком множественном представлении сервер MS SQL позволяет обновлять только одну из таблиц. Итак, мой вопрос: как SQL-сервер определяет, какую таблицу можно обновить?

Я попытался проверить, где я редактирую поля определенной строки в представлении. После этого я использовал OleDbDataAdapter для обновления представления. Только изменения в таблице Foo были приняты. Изменения в таблице Бар были проигнорированы (исключений не было).

Есть ли способ предсказать, какая из таблиц может быть обновлена ​​или способ контролировать, какая из них? Что, если бы я хотел, чтобы Bar была обновляемой таблицей вместо Foo?

Обновление: я нашел это в Google, MS SQL Server 2000 Unleased:

http://books.google.com/books?id=G2YqBS9CQ0AC&pg=RA1-PA713&lpg=RA1-PA713&dq=ms+sql+server+"multitable+view"++updated&source=bl&ots=ZuQXIlEPbO&sig=JbgdDe5yU73aSkxh-SLDdtMYZDs&hl=en&ei=b-0SSq-aHZOitgPB38zgDQ&sa=X&oi=book_result&ct=result&resnum=1#PRA1-PA713,M1

(Почему-то URL, который я пытаюсь вставить, не работает с этим сайтом, извините, что вам нужно скопировать и вставить.)

Что говорит:

  • Обновление через множественное представление не может затрагивать более чем одну базовую базовую таблицу.
  • Удаление не может быть выполнено для множественных представлений.

Но я пока не вижу ответа на свой вопрос.

Опять же, мой вопрос:

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

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

* +1054 * Пример:

Я редактирую Bar.Column1, а затем вызываю метод Update () в OleDbDataAdapter. Это приводит к тому, что таблица столбцов не изменяется и не генерируется исключение. Если я редактирую Foo.Column2, то вызываю Update (), таблица Foo модифицируется.

Ответы [ 2 ]

1 голос
/ 19 мая 2009

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

Лично я предпочитаю вообще не обновлять и не удалять из просмотров. Для этого я использую базовые таблицы.

Существуют также правила, касающиеся возможности обновления представления. Смотрите книги онлайн. Искать это: view-SQL Server, изменение данных

0 голосов
/ 19 мая 2009

Необходимо иметь возможность однозначно идентифицировать строку в таблице, возвращая первичный ключ. Попробуйте вернуть dbo.Bar.Id в представлении, и вы сможете редактировать столбцы в таблице Bar.

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