Мне потребовалось некоторое время, чтобы выяснить здесь непонимание: не уверен, полностью ли я понимаю, но вот оно. Я буду использовать пример, близкий к вашему, но с некоторыми данными - мне легче думать в этих терминах.
Итак, первые две таблицы; 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'.
Так что ограничения на базовые таблицы по-прежнему применяются.
Надеюсь, это поможет, но тогда, возможно, я неправильно понял вашу проблему.
Вам нужно беспокоиться об этом? Внешние ключи управляют вставкой/обновлением данных - они не проверяются при выборе. –
Почему вы не фильтруете оба вида? –
Не могли бы вы привести пример? Я не понимаю, как таблицы чтения могут влиять на ссылочную целостность? Может быть, несколько таблиц с некоторыми данными, мнениями и проблемами, которые у вас есть? –