2

我正在构建一个证券交易所模拟游戏。我有一个名为“Market_data”的表,在游戏中玩家模拟特定日期,并允许使用 SQL 查询来检索历史数据并计划他们的行动过程。我的困难是我需要根据他们正在播放的当前日期限制他们可以访问的行,这样他们就看不到日期大于当前日期的行。

例如:一个用户正在运行游戏并且当前是 2010 年,如果他做了一个简单的选择,比如"SELECT * FROM market_data"我不希望他看到 Date > 'xx-2010' 的行

我知道的唯一解决方案是解析用户的 SQL 并添加 WHERE 子句以删除较新的日期,但这似乎很耗时且容易出错,我不确定是否有更好的选择。任何关于如何做到这一点的想法将不胜感激。

4

3 回答 3

4

解决方案是 SQL 视图,使用视图有几个不同的原因:

* 1. *隐藏数据复杂性。您可能希望提供一个运行常用 SQL 语句的视图,而不是强迫您的用户学习 T-SQL JOIN 语法。

* 2. *保护数据。如果您的表格在某些列中包含敏感数据,您可能希望对某些用户组隐藏这些列。例如,客户姓名、地址和他们的社会保险号可能都存储在同一个表中;但是,对于运输文员等较低级别的员工,您可以创建一个仅显示客户姓名和地址的视图。您可以授予视图权限,而不允许用户查询基础表。您可能希望通过以下几种方式来保护您的数据:

a.创建一个视图以允许仅读取表中的某些列。一个常见的例子是雇员表中的薪水列。您可能不希望所有人员都能够阅读经理或彼此的薪水。这称为对表进行垂直分区,并通过在 CREATE VIEW 语句中仅指定适当的列来完成。

b.创建一个视图以允许从表中仅读取某些行。例如,您可能有部门经理的视图。这样,每个经理只能向其部门的员工提供加薪。这称为水平分区,通过在创建视图的 SELECT 语句中提供 WHERE 子句来实现。

* 3. *执行一些简单的业务规则。例如,如果您希望生成需要接收秋季目录的客户列表,您可以创建以前在秋季购买过您的衬衫的客户的视图。

* 4. *使用 BCP 导出数据。如果您使用 BCP 将 SQL Server 数据导出为文本文件,则可以通过视图格式化数据,因为 BCP 的格式化能力非常有限。

* 5. *自定义数据。如果您希望显示一些计算值或列名的格式与基表列不同,您可以通过创建视图来实现。

参考来自http://sqlserverpedia.com

于 2013-06-03T05:02:18.707 回答
1

1)您可以使用带有自定义规则限制访问的mysql代理http://dev.mysql.com/downloads/mysql-proxy/ 。

2)您可以使用存储过程/函数

3)您可以使用视图

于 2013-06-03T05:25:33.040 回答
0

基本方法是:

-> 阻止该用户(或组)访问基表。

-> 在该表的顶部定义一个视图,该视图仅显示这些用户应该看到的行。

-> 授予这些用户对视图的 SELECT 权限。

-> 并且您还可以使用 SQL 加密、解密和散列概念。

可以在此处找到加密和解密示例:

http://msdn.microsoft.com/en-us/library/ms179331.aspx

哈希示例可以在这里找到:

http://msdn.microsoft.com/en-us/library/ms174415.aspx

于 2013-06-03T05:59:12.727 回答