Một tùy chọn sẽ là tạo một dạng xem từ tất cả các bảng project_xxx. Một cái gì đó như:
CREATE VIEW SecurityTable
AS
SELECT 'Project_1', User, HasAccess
FROM Project_1
UNION
SELECT 'Project_2', User, HasAccess
FROM Project_2
UNION
SELECT 'Project_3', User, HasAccess
FROM Project_3
etc...
Sau đó, bạn có thể chỉ cần truy vấn chế độ xem của mình như thể cơ sở dữ liệu đã được thiết kế đúng cách ngay từ đầu;-)
SELECT ProjectID, User
FROM SecurityTable
WHERE [criteria]
AND HasAccess=1
Khi bạn nói rằng bạn sẽ thường xuyên thêm các bảng dự án mới, tôi khuyên bạn có thể có một bảng bảo mật được điền với một truy vấn động vào mỗi buổi sáng. Ví dụ:
CREATE TABLE Project_1 (
Usr varchar(20),
HasAccess bit)
GO
CREATE TABLE Project_2 (
Usr varchar(20),
HasAccess bit)
GO
CREATE TABLE SecurityTable (
Usr varchar(20),
HasAccess bit)
GO
INSERT INTO Project_1 (Usr, HasAccess) VALUES ('Kermit', 1)
INSERT INTO Project_1 (Usr, HasAccess) VALUES ('MissPiggy', 1)
INSERT INTO Project_2 (Usr, HasAccess) VALUES ('Beaker', 1)
INSERT INTO Project_2 (Usr, HasAccess) VALUES ('TheCount', 0)
GO
Create Procedure LoadSecurityTable
AS
DELETE * FROM SecurityTable
EXEC sp_MSForEachTable
@command1 = 'INSERT INTO SecurityTable (Usr, HasAccess) SELECT Usr, HasAccess FROM ?',
@whereand = 'AND o.name LIKE ''Project_%'''
GO
EXEC LoadSecurityTable
SELECT * FROM SecurityTable