我正在建立一个股票交易所模拟游戏。我有一个名为'Market_data'的表,在游戏中玩家模拟特定日期,并允许使用SQL查询来检索历史数据并规划他们的行动方案。我的困难是我需要根据他们正在播放的当前日期来限制他们可以访问的行,这样他们就无法看到日期大于当前日期的行。
例如:用户正在运行游戏并且目前在2010年,如果他做了一个简单的选择,如"SELECT * FROM market_data"
我不希望他看到带有日期>的行。 'X-X-2010'
我所知道的唯一的解决方法是解析用户的SQL并添加WHERE子句以删除更新的日期,但它似乎耗时且容易出错,我不确定是否有更好的替代方案。任何有关如何做到这一点的想法都将受到感谢。
答案 0 :(得分:3)
解决方案是SQL视图,视图用于以下几个原因:
* 1。 *隐藏数据复杂性。您可能希望提供运行常用SQL语句的视图,而不是强制您的用户学习T-SQL JOIN语法。
* 2. *保护数据。如果您在某些列中包含包含敏感数据的表,则可能希望隐藏某些用户组中的这些列。例如,客户名称,地址和社会安全号码可能都存储在同一个表中;但是,对于像运输职员这样的低级员工,您可以创建仅显示客户姓名和地址的视图。您可以向视图授予权限,而不允许用户查询基础表。您可能需要通过以下两种方式保护数据:
a。创建一个视图以允许仅从表中读取某些列。一个常见的例子是employee表中的salary列。您可能不希望所有人员都能够阅读经理或彼此的薪水。这称为垂直分区表,通过仅指定CREATE VIEW语句中的相应列来完成。
b。创建一个视图以允许只读取表中的某些行。例如,您可能有部门经理的视图。这样,每个经理只能为他或她的部门的员工提供加薪。这称为水平分区,通过在SELECT语句中提供创建视图的WHERE子句来实现。
* 3。 *执行一些简单的业务规则。例如,如果您希望生成需要接收秋季目录的客户列表,您可以创建一个以前在秋季购买过衬衫的客户的视图。
* 4. *使用BCP导出数据。如果您使用BCP将SQL Server数据导出到文本文件中,则可以通过视图格式化数据,因为BCP的格式化能力非常有限。
* 5. *自定义数据。如果希望显示一些与基表列格式不同的计算值或列名,可以通过创建视图来实现。
答案 1 :(得分:1)
1)您可以将mysql proxy http://dev.mysql.com/downloads/mysql-proxy/与限制访问的自定义规则一起使用。
2)您可以使用存储过程/函数
3)您可以使用视图
答案 2 :(得分:0)
基本方法是:
- >阻止用户(或组)访问基表。
- >在该表顶部定义一个视图,该视图仅显示这些用户应该看到的行。
- >在视图上为这些用户授予SELECT权限。
- >您还可以使用SQL加密,解密和散列概念。
加密&解密示例可以在这里找到:
http://msdn.microsoft.com/en-us/library/ms179331.aspx
哈希示例可以在这里找到: