Обновляемое представление в mssql с несколькими таблицами и вычисленными значениями - PullRequest
0 голосов
/ 16 марта 2009

Огромная база данных в mssql2005 с большой кодовой базой в зависимости от структуры этой базы данных.

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

SELECT a.item_id
, a.filename
FROM (
    SELECT id_item AS item_id
    , path AS filename
    FROM xMedia

    UNION ALL

    -- media_path has a different collation
    SELECT item_id AS item_id
    , (media_path COLLATE SQL_Latin1_General_CP1_CI_AS) AS filename
    FROM yMedia

    UNION ALL

    -- fullPath contains more than just the filename
    SELECT itemId AS item_id
    , RIGHT(fullPath, CHARINDEX('/', REVERSE(fullPath))-1) AS filename
    FROM zMedia

    -- real database has over 10 of these tables
) a

Я хотел бы создать единое представление всех этих таблиц, чтобы новому коду, использующему эту катастрофу данных, не нужно было знать обо всех различных таблицах носителей. Я также хотел бы использовать это представление для вставки и обновления заявлений. Очевидно, старый код будет по-прежнему полагаться на актуальность таблиц.

После прочтения страницы MSDN о создании представлений в mssql2005 Я не думаю, что представления с SCHEMABINDING будет достаточно.

Как бы я создал такой обновляемый вид?

Это правильный путь?

Ответы [ 3 ]

2 голосов
/ 16 марта 2009

Прокрутите страницу вниз, на которую вы ссылаетесь, и вы увидите параграф об обновляемых представлениях. Вы не можете обновить представление на основе союзов, помимо других ограничений. Логика этого, вероятно, проста: как Sql Server должен решить, какая исходная таблица / представление должно получать обновление / вставку?

1 голос
/ 24 сентября 2012

Если представление основано на нескольких базовых таблицах, оператор UPDATE для этого представления может работать или не работать в зависимости от оператора UPDATE. Если инструкция UPDATE влияет на несколько базовых таблиц, SQL-сервер выдает ошибку. Принимая во внимание, что если UPDATE влияет только на одну базовую таблицу в представлении, тогда UPDATE будет работать (не всегда правильно). Операторы вставки и удаления всегда будут неудачными.

Триггеры INSTEAD OF используются для корректного ОБНОВЛЕНИЯ, ВСТАВКИ и УДАЛЕНИЯ из представления, основанного на нескольких базовых таблицах. Следующие ссылки имеют примеры вместе с видеоуроком по тому же.

ВМЕСТО ВСТАВКИ Триггер
ВМЕСТО ОБНОВЛЕНИЯ Триггер
ВМЕСТО УДАЛЕНИЯ Триггер

1 голос
/ 16 марта 2009

Вы можете изменить разделенные представления, если они удовлетворяют определенным условиям.

Эти условия включают в себя наличие partitioning column в качестве части первичного ключа в каждой таблице и наличие набора непересекающихся проверочных ограничений для столбца разделения.

Кажется, это не ваш случай.

В вашем случае вы можете выполнить одно из следующих действий:

  • Воссоздайте ваши таблицы в виде представлений (с вычисленными столбцами), чтобы ваш прежний софт работал, и обращайтесь ко всей таблице из нового софта
  • Используйте триггеры INSTEAD OF для обновления таблиц.
...