2014-02-21 93 views
1

我正在寻找使用SSRS在应用程序中生成报告,并发现使用SSRS报告中定义的SQL数据集是相当严格的。就我所见,我可以通过将SQL查询实际作为参数传递给报表来解决该问题,并将数据集设置为使用该参数作为SQL查询。我知道这种类型的动态SQL通常被忽略,但我需要看看我的选择是什么。替代动态SQL查询SSRS报告

这里有一些背景,我的推理是我有一些非常复杂的查询,并且在我的PHP应用程序中,我有很多构造函数(连接,子查询等)被抽象出来,使查询更容易应用程序不同部分的可重用条款。我可能在使用函数的报表生成器中实现同样的功能(仍然需要动态sql),但是我仍然在复制一大堆我已经在PHP中使用的东西(请记住特定的语言是不相关的),因为我需要一些这些SQL结构在我的应用程序中。我也不想使用存储过程,从过去的经验来看,我发现它们是一个痛苦的工作,一旦查询变得非常复杂,并且你有很多不同的可能条件,它变得很难看。存储过程中的动态SQL是调试的噩梦,除了让你失去使用存储过程的性能好处之外。

所以我很好奇的是将SQL字符串传递给报告的性能影响,而不是查询内联(记住我不会使用存储过程)。它会以某种方式使查询变慢,或者它会等同于在PHP中执行查询吗?其次,这种做法有哪些其他问题/风险?假如我在传递SQL之前对SQL进行了清理,那么这样做是否会存在其他主要安全风险?第三,有没有另外一种我没有想到的会更好?

回答

1

我主要看到问题sql注入。如果你可以传递查询,那么任何人都可以做到。

为什么不真正使用存储过程,它的编译,即使动态sql不是最好的,它可能值得它。

顺便问一下,你确定你的查询是如此复杂,它应该被构造?这不是SQL本身的问题吗?

你有没有想过功能(但当然与动态)。

有一个大量的解决方案,如果我使用SSRS来传递我的查询的一些地方,它总是那么布尔没有SQL注入的可能性

+0

呀,这个想法是,所有的参数应该是消毒的,他们必须是整数/日期/布尔值,这使我很容易消毒。然后,如果我的报告被嵌入,我假设有一种方法可以阻止直接通过URL运行报告,在这种情况下,没有人可以传递他们想要的任何SQL,充其量他们可以尝试在参数中注入某些内容,但我会消毒他们,所以它不会工作。 – Rocket04