Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 允许查询生成的数据层_Sql_Data Access Layer_Query Builder_Weak Typing - Fatal编程技术网

Sql 允许查询生成的数据层

Sql 允许查询生成的数据层,sql,data-access-layer,query-builder,weak-typing,Sql,Data Access Layer,Query Builder,Weak Typing,我需要提供一个小应用程序,允许客户端根据本地数据库创建查询(或“规则”),并触发某些操作(发送邮件、短信等) 因为他们可以声明作业的实际SQL,所以我想知道我的数据层应该是什么样子。我似乎不需要实体和存储库,因为所有的数据交互都是弱类型的 那么我的数据层应该做什么呢?打开连接,接受输入SQL,并返回属性包列表?我需要一个数据层吗 [更新] 这就是客户端希望在其应用程序中拥有的功能,以便能够针对其数据库编写或构建查询。它将在他们的本地计算机上运行,这意味着恶意员工不需要SQL注入攻击 但是,即使我

我需要提供一个小应用程序,允许客户端根据本地数据库创建查询(或“规则”),并触发某些操作(发送邮件、短信等)

因为他们可以声明作业的实际SQL,所以我想知道我的数据层应该是什么样子。我似乎不需要实体和存储库,因为所有的数据交互都是弱类型的

那么我的数据层应该做什么呢?打开连接,接受输入SQL,并返回属性包列表?我需要一个数据层吗

[更新]

这就是客户端希望在其应用程序中拥有的功能,以便能够针对其数据库编写或构建查询。它将在他们的本地计算机上运行,这意味着恶意员工不需要SQL注入攻击


但是,即使我有一个可视化控件来构建查询、验证和清理查询,这一层的最终结果还是SQL代码,不是吗?如果我想测试它,我该如何提取?

通常,直接从用户处接受
SQL
SQL
查询的任何输入被认为是危险的,因为这样的代码很容易受到攻击。相反,如果这不是一种一次性的情况,并且您希望为用户提供查询任何内容的灵活性,那么您应该定义一种中间语言,用户将使用该语言指定过滤条件,该语言将用于SQL查询生成。这边,你有

  • 在将用户输入添加到查询之前,有机会对其进行清理
  • 将对象模型与用户分离,这样,如果以后要更改对象模型或存储本身,只要将适配器从该中间语言写入修改后的对象模型或新存储,用户就不会受到任何影响

  • 我们在一个项目中做到了这一点,为用户提供了根据基础数据模型的任何属性进行筛选、排序和分组的灵活性,这种方法非常有效。

    使用PL/SQL或更好的ETL工具构建报告数据库/star schema,它允许您清理/丰富数据,预先应用业务规则,对列和表使用业务语言,而不是技术术语,让用户查询快速返回,并在星型模式上放置一个报告工具,如Cognos,它为用户预联接所有表,并允许您应用管理规则以防止用户愚蠢


    这是最简单、最有效的方法,但并不便宜

    事实上,10多年前我们遇到了几乎相同的问题(尽管它不在本地数据库中)。IMHO对于特别SQL查询(无论它们是如何创建的,用户可能只需要一个文本shell来输入它们),DAL对于应用程序的通用报告/查询部分没有多大意义。这并不意味着您不能为应用程序中修改数据或将数据输入数据库的部分设置DAL

    然而,你应该注意一些事情。显然,语法错误的查询应该给出有意义的错误消息,并且应该有可能中断长时间运行的查询


    限制对特定表的即席查询访问,或者提供特定视图的一层,以便向用户隐藏数据模型的技术部分,这也是一个好主意。而且我会避免允许您的用户以类似的特别方式修改任何数据-确保他们不能将任何更新语句插入到他们创建的SELECT语句中。

    您是说他们需要一个报告数据库来分析其业务,还是说他们需要能够基于应用程序数据库构建条件警报规则,例如“如果数量<重新订购级别,请在这些数字上发一条重新订购的信息?”史蒂夫:只需有条件的警报,实际上是非常简单的警报。这实际上是一项要求,但提出得比较晚(我认为它们只需要一些固定的规则),所以没有太多的空间来改变价格和截止日期。谢谢!虽然,最有效?可能。但最简单?在我的情况下,我怀疑。:)嗯,这是一个在本地机器上运行的应用程序,这意味着用户可以简单地启动整个电脑。尽管如此,我还是考虑过对其进行消毒以防止意外的数据库更新,但强制哼哼,学习一种必须支持各种SQL功能的中间语言对双方来说似乎都是小题大做。对于一个客户来说,这只是一个小项目,所以我认为这样做没有任何意义。但最终,即使使用上述中间语言,如果它编译成SQL,我也不需要stro数据层。谢谢,这很好。实际上,这是一个非常小的应用程序:例如,它应该检查客户的约会日期,并在到期时向他们发送提醒,以及其他一些类似的规则。但是他们想要修改这些规则并创建全新规则的自由,而且他们有大量相关的表这使得预测他们真正需要什么变得很困难。是的,我会阻止任何事情,但没有DAL的部分对我来说是新闻,即使对于这样的小应用程序也是如此。当他们的查询特定于他们现有的技术时,抽象DBMS甚至没有多大意义。@Dilbert:受众也是一个不同点:当你假设你的用户在某种程度上具备SQL知识时,你可以让很多事情变得简单得多,就像他们没有一样。例如,两个月前,我们创建了一个简单的基于Excel的解决方案,其中我们的用户有一个表,其中包含约100条select语句,他们可以自己扩展,这些语句经过预处理,然后在上面执行一个接一个地与数据库进行比较,然后将结果组合/合并到结果表中,以供进一步评估。效果很好,但仅适用于特定(内部)用户群。