एक विकल्प सभी project_xxx तालिकाओं से एक दृश्य बनाना होगा। कुछ इस तरह:
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...
तब आप बस अपने विचार को क्वेरी कर सकते हैं जैसे कि डेटाबेस को पहले स्थान पर ठीक से डिज़ाइन किया गया था;-)
SELECT ProjectID, User
FROM SecurityTable
WHERE [criteria]
AND HasAccess=1
जैसा कि आप कहते हैं कि आप अक्सर नई परियोजना तालिकाएँ जोड़ते रहेंगे, मेरा सुझाव है कि आपके पास हर सुबह एक गतिशील क्वेरी के साथ एक सुरक्षा तालिका हो सकती है। उदाहरण के लिए:
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