Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Thay thế cho hàm cho SQL động

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tính tỷ lệ phần trăm bằng câu lệnh SQL

  2. Kết quả kỳ lạ từ truy vấn SQL?

  3. Cách sử dụng hàm IDENTITY () trong SQL Server

  4. SqlDataReader.HasRows trả về false kể từ khi nâng cấp SQL 2008

  5. Cách tổng hợp các tài khoản