使用扩展属性的

时间:2016-03-15 09:41:19

标签: sql-server security sql-server-2012 extended-properties

我们要求客户提供对临时数据库的访问权限,以便他们可以将数据提取到自己的服务器中,但每个表都包含所有客户数据。所有表都有一个'CustomerID'列。客户应该只看到customerID与他们相同的行。

我不是在寻找为每个客户创建单独的数据库或视图的建议,因为这两个建议都是高维护和低效率的。

我的解决方案必须与之合作:

  • 100GB数据库
  • 400表
  • 核心交易数据库每30分钟更新一次
  • 季度架构更改(应用程序处于持续开发阶段)。

有人可以给我一个明确的答案,说明为什么以下方法不安全或不起作用?:

我为每个客户设置了一个数据库用户,其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。多数民众赞成!

1 个答案:

答案 0 :(得分:0)

我将重申每个人已经陈述的内容并总结一下。

  1. 你的工作比以前更难。
  2. 创建一个视图,这只是他们的数据,然后授予他们对该视图的安全访问权。
  3. 或者,从" Core"中提取所有数据。数据库和他们自己的数据库,并给他们必要的访问权限。