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

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

CREATE VIEW [dbo].[vwCheckBookingToCheck]
WITH SCHEMABINDING
AS
SELECT  [checkUser].[CheckID] ,
        [checkUser].[CheckToTypeID] ,
        [checkUser].[CheckNumber] ,
        [checkUser].[CheckDate] ,
        [checkUser].[CheckAmount] ,
        [checkUser].[CheckStatusID] ,
        [checkUser].[CheckAcceptedBy] ,
        [checkUser].[CreatedBy] ,
        [checkUser].[CreatedDateTime] ,
        [checkUser].[CheckToUserID] [ToID],
        [checkUser].[CheckFromCompanyID] [FromID],
        [companyFrom].[CompanyName]
FROM    [dbo].[CheckUser] [checkUser]
        INNER JOIN [dbo].[Company] [companyFrom] ON [companyFrom].[CompanyID] = [checkUser].[CheckFromCompanyID]

UNION ALL

SELECT  [checkCompany].[CheckID] ,
        [checkCompany].[CheckToTypeID] ,
        [checkCompany].[CheckNumber] ,
        [checkCompany].[CheckDate] ,
        [checkCompany].[CheckAmount] ,
        [checkCompany].[CheckStatusID] ,
        [checkCompany].[CheckAcceptedBy] ,
        [checkCompany].[CreatedBy] ,
        [checkCompany].[CreatedDateTime] ,
        [checkCompany].[CheckToCompanyID] [ToID],
        [checkCompany].[CheckFromCompanyID] [FromID] ,
        [companyFrom].[CompanyName]
FROM    [dbo].[CheckCompany] [checkCompany]
       INNER JOIN [dbo].[Company] [companyFrom] ON [companyFrom].[CompanyID] = [checkCompany].[CheckFromCompanyID]

GO

вот моя вставка, я только вставляю в [CheckUser] или [CheckCompany]:

INSERT INTO [dbo].[vwCheckBookingToCheck]   
    ( [CheckToTypeID] ,
      [CheckNumber] ,
      [CheckDate] ,
      [CheckAmount] ,
      [CheckStatusID] ,
      [CheckAcceptedBy] ,
      [CreatedBy] ,
      [CreatedDateTime] ,
      [ToID] ,
      [FromID] 
    )
     SELECT 2,
      'Test' , -- CheckNumber - varchar(255)
      '2014-08-23 20:07:42' , -- CheckDate - date
      1233 , -- CheckAmount - money
      0 , -- CheckStatusID - int
      1 , -- CheckAcceptedBy - int
      1 , -- CreatedBy - int
      '2014-08-23 20:07:42' , -- CreatedDateTime - datetime
      1,  -- ToID - int
      1  -- FromID - int

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

Я использую SQL Server 2012, любая помощь приветствуется.

спасибо, Пол!--3-->

2 ответов


Это немного долго для комментария.

Я не могу легко найти документацию 2012 по этому вопросу, но документация по SQL Server 2008 вполне понятно:

представление считается обновляемым секционированным представлением, если это представление набор инструкций SELECT, отдельные результирующие наборы которых объединены в один, используя оператор UNION ALL. каждая инструкция SELECT ссылки на одну базу SQL Server таблица.

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


вы можете обойти это путем добавления "вместо" trigger для просмотра и обновления базовых таблиц вместо этого.