在SQL Server 2008中,我有一个用户可以对数据库运行查询的应用程序。我想阻止他们运行将返回数百万结果和税收系统资源的查询。当前的解决方案是在count(*)函数中输入任何查询,如下所示:
Select count(*) as COUNT
from (SELECT SOMETHING FROM SOMETABLE) as TMPCOUNT0;
在用户尝试自行运行COUNT(*)
之前正常工作。
Select count(*) as COUNT
from (SELECT COUNT(*) FROM SOMETABLE) as TMPCOUNT0;
--(should return 1)
但是,SQL Server不喜欢我的内部COUNT(*)
列在我的派生表中没有名称,并且出错:
没有为“TMPCOUNT0”的第1列指定列名。
我知道如果我通过指定内部计数的名称来运行查询,我可以解决这个问题,但由于最终用户没有意识到这一点,我希望找到更优雅的解决方案。
有什么想法吗?
答案 0 :(得分:4)
在Stack Exchange Data Explorer存在之前,我在一个小网站上玩,让人们对公共Stack Overflow数据集运行查询。我最初的产品是由Atom 330提供支持,我的家里只有2GB的RAM,因此我非常担心有限的查询,以防止他们完全接管我的服务器并充斥我的家庭宽带连接。
我最终得到的是@Philip Fourie's answer和SET QUERY_GOVERNOR_COST_LIMIT中提到的SET ROWCOUNT
选项的组合。后者需要进行大量的调整,如果用户知道或想要尝试它们,它们都可以被覆盖,所以我也记录了每个查询,以便发现滥用。
这种组合有它的弱点,但效果很好。
答案 1 :(得分:3)
不确定如何解决COUNT(*)问题但是如何通过指定
来限制结果 SELECT TOP(1000) ...
或者
SET ROWCOUNT 1000
返回前千行。
答案 2 :(得分:0)
错误
发生没有为“TMPCOUNT0”的第1列指定列名。
是因为您没有在内部查询中指定列名。
内部查询应显示为
SELECT COUNT(*) **as c** FROM SOMETABLE as TMPCOUNT0
此查询将返回1,但您必须在内部查询中指定该计数的别名。
Select count(c) as [COUNT] from (SELECT COUNT(*) as c FROM SOMETABLE) as TMPCOUNT0