Мне потребовалось некоторое время, чтобы выяснить недоразумение здесь - не уверен, что я все еще полностью понимаю, но вот оно.
Я буду использовать пример, близкий к вашему, но с некоторыми данными - мне проще думать в этих терминах.
Итак, первые две таблицы; A = Отдел B = Сотрудник
CREATE TABLE Department
(
DepartmentID int PRIMARY KEY
,DepartmentName varchar(20)
,DepartmentColor varchar(10)
)
GO
CREATE TABLE Employee
(
EmployeeID int PRIMARY KEY
,EmployeeName varchar(20)
,DepartmentID int FOREIGN KEY REFERENCES Department ( DepartmentID )
)
GO
Теперь я добавлю некоторые данные в
INSERT INTO Department
( DepartmentID, DepartmentName, DepartmentColor )
SELECT 1, 'Accounting', 'RED' UNION
SELECT 2, 'Engineering', 'BLUE' UNION
SELECT 3, 'Sales', 'YELLOW' UNION
SELECT 4, 'Marketing', 'GREEN' ;
INSERT INTO Employee
( EmployeeID, EmployeeName, DepartmentID )
SELECT 1, 'Lyne', 1 UNION
SELECT 2, 'Damir', 2 UNION
SELECT 3, 'Sandy', 2 UNION
SELECT 4, 'Steve', 3 UNION
SELECT 5, 'Brian', 3 UNION
SELECT 6, 'Susan', 3 UNION
SELECT 7, 'Joe', 4 ;
Итак, теперь я создам представление на первой таблице, чтобы отфильтровать некоторые отделы.
CREATE VIEW dbo.BlueDepartments
AS
SELECT * FROM dbo.Department
WHERE DepartmentColor = 'BLUE'
GO
Это возвращает
DepartmentID DepartmentName DepartmentColor
------------ -------------------- ---------------
2 Engineering BLUE
И, согласно вашему примеру, я добавлю представление для второй таблицы, которая ничего не фильтрует.
CREATE VIEW dbo.AllEmployees
AS
SELECT * FROM dbo.Employee
GO
Это возвращает
EmployeeID EmployeeName DepartmentID
----------- -------------------- ------------
1 Lyne 1
2 Damir 2
3 Sandy 2
4 Steve 3
5 Brian 3
6 Susan 3
7 Joe 4
Мне кажется, что вы думаете, что Сотрудник № 5, DepartmentID = 3 балла в никуда?
"Вы получите записи в
Второй взгляд на эту точку никуда. "
Ну, это указывает на таблицу Department
DepartmentID = 3
, как указано с помощью внешнего ключа. Даже если вы попытаетесь присоединиться к представлению в представлении , ничто не сломается:
SELECT e.EmployeeID
,e.EmployeeName
,d.DepartmentID
,d.DepartmentName
,d.DepartmentColor
FROM dbo.AllEmployees AS e
JOIN dbo.BlueDepartments AS d ON d.DepartmentID = e.DepartmentID
ORDER BY e.EmployeeID
Возвращает
EmployeeID EmployeeName DepartmentID DepartmentName DepartmentColor
----------- -------------------- ------------ -------------------- ---------------
2 Damir 2 Engineering BLUE
3 Sandy 2 Engineering BLUE
Так что здесь ничего не нарушено, объединение просто не нашло подходящих записей для DepartmentID <> 2
Это фактически то же самое, как если бы я объединял таблицы , а затем включил фильтр , как в первый вид:
SELECT e.EmployeeID
,e.EmployeeName
,d.DepartmentID
,d.DepartmentName
,d.DepartmentColor
FROM dbo.Employee AS e
JOIN dbo.Department AS d ON d.DepartmentID = e.DepartmentID
WHERE d.DepartmentColor = 'BLUE'
ORDER BY e.EmployeeID
Возвращается снова:
EmployeeID EmployeeName DepartmentID DepartmentName DepartmentColor
----------- -------------------- ------------ -------------------- ---------------
2 Damir 2 Engineering BLUE
3 Sandy 2 Engineering BLUE
В обоих случаях объединения не завершаются неудачей, они просто делают как положено.
Теперь я попытаюсь нарушить ссылочную целостность через представление (нет DepartmentID = 127)
INSERT INTO dbo.AllEmployees
( EmployeeID, EmployeeName, DepartmentID )
VALUES( 10, 'Bob', 127 )
И это приводит к:
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the FOREIGN KEY constraint "FK__Employee__Depart__0519C6AF". The conflict occurred in database "Tinker_2", table "dbo.Department", column 'DepartmentID'.
Если я пытаюсь удалить отдел через представление
DELETE FROM dbo.BlueDepartments
WHERE DepartmentID = 2
Что приводит к:
Msg 547, Level 16, State 0, Line 1
The DELETE statement conflicted with the REFERENCE constraint "FK__Employee__Depart__0519C6AF". The conflict occurred in database "Tinker_2", table "dbo.Employee", column 'DepartmentID'.
Таким образом, ограничения на базовые таблицы все еще применяются.
Надеюсь, это поможет, но тогда, возможно, я неправильно понял вашу проблему.