Определить отношение к таблицам в целом - PullRequest
0 голосов
/ 10 октября 2019

Мне нужно определить таблицу, которая в основном будет содержать Id для пользователя, и второй столбец, в котором будут перечислены имена таблиц, к которым у пользователя есть доступ. Я не могу придумать, как определить здесь какие-либо отношения в случае изменения оригинальных имен таблиц. Вся логика будет на уровне приложения. Тем не менее, я хотел бы иметь возможность определить какие-то ограничения. Как я могу это сделать? Кроме того, я открыт для совета относительно любого другого способа сделать это.

Ответы [ 3 ]

1 голос
/ 10 октября 2019

Я действительно смущен. Разве команда grant не делает точно то, что вы хотите? Предполагается, что необходимые операции являются операциями с базой данных.

Если у вас есть более настраиваемый набор операций, вы можете отслеживать изменения имени таблицы с помощью триггеров DDL .

0 голосов
/ 10 октября 2019

Так как пользователи НЕ являются логинами SQL Server, поэтому, я думаю, вы можете использовать триггер DDL для отслеживания переименования таблиц, где вы можете изменить имя таблицы в своей пользовательской таблице безопасности. Но я не знаю, можете ли вы выдать исключение в этом триггере, чтобы предотвратить переименование таблицы (имитируя какой-то тип ограничения). Также было бы лучше, если бы вы сохраняли имя таблицы в каждой строке, а не сохраняли имена таблиц через запятую в 1 поле.

Если вы можете использовать логины SQL, тогда решение Гордана также применимо, но иногда вы не можете создать SQLВход в систему, если у вас есть разные базы данных приложений вместе с сотнями тысяч пользователей.

0 голосов
/ 10 октября 2019

Вот подробный пример кода того, как этого добиться с помощью RLS

USE tempdb;
GO

CREATE TABLE dbo.OKTable
(
    OKTableID int IDENTITY(1,1) NOT NULL
        CONSTRAINT PK_dbo_OKTable PRIMARY KEY,
    SecuredInfo varchar(100)
);
GO

INSERT dbo.OKTable (SecuredInfo)
VALUES ('Very'), ('Secret'), ('Stuff');
GO

CREATE TABLE dbo.NotOKTable
(
    NotOKTableID int IDENTITY(1,1) NOT NULL
        CONSTRAINT PK_dbo_NotOKTable PRIMARY KEY,
    SecuredInfo varchar(100)
);
GO

INSERT dbo.NotOKTable (SecuredInfo)
VALUES ('Other'), ('Important'), ('Things');
GO

CREATE SCHEMA [Security] AUTHORIZATION dbo;
GO

CREATE TABLE [Security].PermittedTableUsers
(
    PermittedTableUsers int IDENTITY(1,1) NOT NULL
        CONSTRAINT PK_Security_PermittedTableUsers 
        PRIMARY KEY,
    UserName sysname,
    SchemaName sysname,
    TableName sysname
);
GO

INSERT [Security].PermittedTableUsers (UserName, SchemaName, TableName)
VALUES (N'dbo', N'dbo', 'OKTable');
GO

ALTER FUNCTION [Security].CheckUserAccess
(
    @SchemaName AS sysname,
    @TableName AS sysname
)  
RETURNS TABLE  
WITH SCHEMABINDING  
AS  
    RETURN SELECT 1 AS CheckUserAccessOutcome
           WHERE EXISTS (SELECT 1 FROM [Security].PermittedTableUsers AS ptu
                                  WHERE ptu.UserName = USER_NAME()
                                  AND ptu.SchemaName = @SchemaName
                                  AND ptu.TableName = @TableName);
GO

CREATE SECURITY POLICY OKTableAccessFilter 
ADD FILTER PREDICATE [Security].CheckUserAccess (N'dbo', N'OKTable')
ON dbo.OKTable  
WITH (STATE = ON); 
GO
CREATE SECURITY POLICY NotOKTableAccessFilter 
ADD FILTER PREDICATE [Security].CheckUserAccess (N'dbo', N'NotOKTable')
ON dbo.NotOKTable  
WITH (STATE = ON); 
GO

SELECT * FROM dbo.OKTable;
SELECT * FROM dbo.NotOKTable;
GO

Более подробно он описан в этой ссылке:

https://blog.greglow.com/2019/10/10/sql-how-to-control-access-to-sql-server-tables-by-entries-in-another-table/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...