我们要求客户提供对临时数据库的访问权限,以便他们可以将数据提取到自己的服务器中,但每个表都包含所有客户数据。所有表都有一个'CustomerID'列。客户应该只看到customerID与他们相同的行。
我不是在寻找为每个客户创建单独的数据库或视图的建议,因为这两个建议都是高维护和低效率的。
我的解决方案必须与之合作:
有人可以给我一个明确的答案,说明为什么以下方法不安全或不起作用?:
我为每个客户设置了一个数据库用户,其customerID作为扩展属性。
我已经创建了一个每个表的视图,这些表动态地从表中选择*,其中customerID列与登录用户的扩展属性CustomerID相同。代码看起来像这样,看起来效果很好:
CREATE VIEW [CustomerAccessDatabase].[vw_Sales]
AS SELECT * FROM [CustomerAccessDatabase].[Sales]
WHERE [Sales].[CustomerID]=
(SELECT CONVERT(INT,p.value) AS [Value]
FROM sys.extended_properties
JOIN sys.sysusers ON extended_properties.major_id=sysusers.[uid]
AND extended_properties.name = 'CustomerID'
AND sysusers.[SID]=(SELECT suser_sid())
);
GO
为了提供对视图的访问,我创建了一个通用数据库角色'Customer_Access_Role'。此角色具有授予所有表视图的访问权限,但拒绝访问数据库表本身。
为了防止用户更改自己的customerID,我拒绝访问扩展属性,如下所示:
USE [master];
GO
DENY EXEC ON sys.sp_addextendedproperty to [public];
GO
DENY EXEC ON sys.sp_dropextendedproperty to [public];
GO
DENY EXEC ON sys.sp_updateextendedproperty to [public];
GO
最终结果是我只需要一个数据库和一组权限。
要添加新客户,我需要做的就是创建一个新用户,将其customerID作为扩展属性,并将它们添加到Customer_Access_Role。多数民众赞成!
答案 0 :(得分:0)
我将重申每个人已经陈述的内容并总结一下。