我想在我的所有表上实现行级安全性。每个表都有一个名为的列data_classification
,其中包含一个值列表。理想情况下,我想创建允许查看某些行的数据库角色。当我添加新用户时,这将允许可扩展性。我能找到的所有 RLS 示例都是针对用户的。
我的尝试如下。我创建了一个表,其中每个角色都有一个列,每个权限类型都有一个行。如果角色有权访问该权限,则填写权限名称,否则为 Null。给定一个用户名,我使用
DECLARE @role_name nvarchar(50);
set @role_name = SELECT dp.name as role_name
FROM sys.sysusers us right
JOIN sys.database_role_members rm ON us.uid = rm.member_principal_id
JOIN sys.database_principals dp ON rm.role_principal_id = dp.principal_id
WHERE us.name = USER_NAME();
EXEC('SELECT ' + @role_name + ' FROM [admin].[data_permissions] WHERE ' + @role_name + ' IS NOT NULL')
选择角色拥有的所有权限。但是我似乎无法将其放入要过滤的谓词中,我期待这样的事情
CREATE FUNCTION DataFilter.fn_data_classification(@data_classification AS varchar(20))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS result
WHERE
@data_classification in (Query above)
这不起作用,我不断收到语法错误。任何帮助将非常感激。如果这使事情变得更容易,更改权限表也是可能的。谢谢
======
编辑:我有 data_classificationsa,b,c,d,e
和 roles role_x, role_y, role_z
,role_x
有权限a,b,c,d,e
,role_y
有权限查看a,c,d
和role_z
有权限查看b,c,e
。如果需要一个新角色或一个新的数据分类,我也想让它可扩展。
我还想在所有表上添加此过滤器,希望使用尽可能少的命令。
当然,它比这更简单。例如
输出
您还可以将 (Role,DataClassification) 权利存储在一个表中,并从您的 RLS 谓词中引用它,例如: