2016-02-22 2 views
0

Я эту схему при условии и неизменяемый:Insertable UNION ALL VIEW на SQL Server 2012

Table: Company1 Customers 
+-------------+---------------+ 
| Customer ID | Customer Name | 
+-------------+---------------+ 
| C0001  | ACME Inc.  | 
| C0002  | Bogus Corp. | 
+-------------+---------------+ 

Table: Company2 Customers 
+-------------+---------------+ 
| Customer ID | Customer Name | 
+-------------+---------------+ 
| C0001  | Foo Bar Ltd. | 
| C0002  | John Smith | 
+-------------+---------------+ 

Мне нужен вставляемый/обновляемый/deleteable вид, как это:

View: All Customers 
+----------+-------------+---------------+ 
| Company | Customer ID | Customer Name | 
+----------+-------------+---------------+ 
| Company1 | C0001  | ACME Inc.  | 
| Company1 | C0002  | Bogus Corp. | 
| Company2 | C0001  | Foo Bar Ltd. | 
| Company2 | C0002  | John Smith | 
+----------+-------------+---------------+ 

и я построил его как :

CREATE VIEW [All Customers] AS 
    SELECT 'Company1' AS [Company], [Customer ID], [Customer Name] 
    FROM [Company1_Customers] 
UNION ALL 
    SELECT 'Company2' AS [Company], [Customer ID], [Customer Name] 
    FROM [Company2_Customers] 

Как (если это возможно), я могу сказать, что SQL Server все INSERT/UPDATE/DELETE операции в этой точке зрения где [Company] = 'Company1' принадлежат Company1_Customers и где [Company] = 'Company2' принадлежат к Company2_Customers?

+0

Возможный дубликат [Если я обновляю представление, будут обновлены мои исходные таблицы] (http://stackoverflow.com/questions/2648445/if-i-update-a-view-will-my-original-tables -get обновляемый) – dfundako

ответ

2

Вы можете сделать это, создав триггер INSTEAD OF для вставок/обновлений/удалений.

Вы можете проверить виртуальные таблицы inserted и deleted, чтобы увидеть, какая таблица затронута, и на основе этого выполнить правильное утверждение. Пример для INSTEAD OF DELETE триггера:

CREATE TRIGGER trigger_delete_all_customers ON [All Customers] 
INSTEAD OF DELETE 
AS 
BEGIN 
    DELETE c 
    FROM deleted AS d 
     INNER JOIN Company1_Customers AS c ON 
       c.[Customer ID]=d.[Customer ID] 
    WHERE 
     d.[Company]='Company1'; 

    DELETE c 
    FROM deleted AS d 
     INNER JOIN Company2_Customers AS c ON 
       c.[Customer ID]=d.[Customer ID] 
    WHERE 
     d.[Company]='Company2'; 
END 

Для получения дополнительной информации о создании INSTEAD OF триггера, обратитесь к documentation.

0

От here вы увидите, что

"Любые изменения, в том числе UPDATE, INSERT и DELETE заявления, должны ссылаться на столбцы только из одной базовой таблицы."

У вас есть две базовые таблицы для каждого поля, из-за вашего UNION, поэтому этот вид не может быть «ОБНОВЛЕНО».

Ваш лучший выбор - исправить вашу схему и иметь одну таблицу Customer, с Company как один из столбцов. Ваша текущая схема, которая требует запроса UNION, не является максимальной.

Смежные вопросы