Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Alternatywa dla funkcji dla dynamicznego SQL

Jedną z opcji byłoby utworzenie widoku ze wszystkich tabel project_xxx. Coś takiego:

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...

Następnie możesz po prostu zapytać o swój widok, tak jakby baza danych została zaprojektowana prawidłowo;-)

SELECT ProjectID, User
FROM   SecurityTable
WHERE [criteria]
AND   HasAccess=1

Ponieważ twierdzisz, że będziesz często dodawać nowe tabele projektów, sugerowałbym, abyś codziennie rano zapełniał tabelę bezpieczeństwa dynamicznym zapytaniem. Na przykład:
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. Konwertuj obiekt SQL Server DateTime na BIGINT (takty .Net)

  2. Wstaw zbiorczy z parametrem nazwy pliku

  3. Problem z funkcją okna w SQL Server 2008 R2

  4. Pakiet SSIS wyświetla błąd po wdrożeniu SQL Server 2012

  5. Przedstawiamy nową funkcję — raport dotyczący wzrostu bazy danych Spotlight Cloud