2011-04-13 74 views
2

我有一个.NET应用程序,它将信息存储在sql服务器数据库中。许可问题

我想为我的应用程序添加许可,只允许数据库中的某些项目取决于许可证。 所以说,例如,我有一个“物品”表,许可证是5000件物品。

我面临的问题是,如果表行数大于5000,我不能依靠我的应用程序不插入项目,因为用户可以直接将项目插入到数据库中,因为由服务器提供客户可以完全不受限制地访问数据库。 (我不能使用任何SQL服务器端解决方案以及由于这个特定的问题)

此外,如果我添加一个字段的表填充项目信息用密码散列然后用户可以不再手动添加项目,但然后我将不得不运行整个表格,并检查每个项目是否已授权并计数许可项目,然后再确定是否添加每个新项目。这是不实际的,因为我每分钟收到数百件物品,因此会大大影响性能。

有没有人有任何想法如何实现这一目标?

+1

你有没有想过限制该软件以不同的方式。除了简单地知道有多少行,并且如果有超过5000个项目,根本不允许应用程序运行,我就没有办法。老实说,你不能同时拥有“允许用户手动添加项目”和“防止用户在达到5,000限制后添加项目”。 – 2011-04-13 15:18:50

+0

我不希望用户手动添加项目,但问题是用户也可以访问数据库,因为有时我会在他们的服务器上安装应用程序。 – ElArZ 2011-04-13 15:26:17

+0

如果您每分钟收到100个项目,那么您的许可证仅在大约50分钟内有效吗?你确定**这是要走的路吗? – 2011-04-14 15:22:14

回答

2

您可以颠倒限制条件并将查询限制为5000条结果。这可以通过TOP条款轻松完成。

用这种方式,无论用户推入数据库的行数是多少,您的程序只能使用许可的行。

3

您最好的选择可能是Items表上的INSTEAD OF trigger拒绝插入超出限制。

+0

用户将有权访问数据库,因为它是他们自己的服务器,甚至有时他们自己的SQL实例很可悲,我不能在SQL端使用任何方法。 – ElArZ 2011-04-13 15:28:26

+0

@ElArZ如果用户完全控制了数据库,那么你可以做的事情并不多。他们可以做的伎俩来抵消客户端可以做的任何事情。他们可以用视图替换表格,然后随意交换和删除基础表格的各个部分。 – 2011-04-13 15:32:27

+0

@ElArZ,你为什么不让这个'INSTEAD OF'触发器在代码上做一个镜像。如果超级用户更改或删除触发器,则可以将其与代码1进行比较并限制访问权限,重新创建触发器或仅执行无效操作并关闭程序 – 2012-06-19 20:23:32

0

我也推荐一个简单的触发器(如果你愿意,你可以基于配置表)。

我想了解更多有关整体业务需求的信息,因为如果您每分钟收到数百行数据,似乎表格会在一小时内填满。

0

我会将DL的许可证验证全部分离出来。相反,如果验证失败,应用程序会在某个时刻运行验证脚本,然后执行所需的(禁用/ warnig)操作。

像这样的东西应该返回速度非常快:

SELECT [TableName] = so.name, [RowCount] = MAX(si.rows) FROM sysobjects so, sysindexes si WHERE so.xtype = 'U' AND si.id = OBJECT_ID(so.name) GROUP BY so.name ORDER BY 2 DESC