我有一群用户在运行SQL Server的数据库中进行临时查询。有时,有人会运行一个查询,在检索10MM行时会长时间锁定系统。
特定登录连接时是否可以设置一些选项? e.g:
如果在SQL Server 2000中无法做到这一点,是否可以在其他版本中使用?据我所知,资源调控器不会给你这样的控制(它只是让你管理内存和CPU)。
我意识到用户可以自己做很多事情,但如果我可以从每个用户的服务器控制它,那就太棒了。
显然我想让用户远离直接的桌面/视图访问,但目前这不是一个选项。
答案 0 :(得分:2)
您当然可以限制查询结果。我正在为StackQL使用看起来像这样的存储过程:
CREATE PROCEDURE [dbo].[WebQuery]
@QueryText nvarchar(1000)
AS
BEGIN
INSERT INTO QueryLogs(QueryText)
VALUES(@QueryText)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET QUERY_GOVERNOR_COST_LIMIT 15000
SET ROWCOUNT 500
Begin Try
exec (@QueryText)
End Try
Begin Catch
SELECT ERROR_NUMBER() AS ErrorNumber,
ERROR_MESSAGE() AS ErrorMessage,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_LINE() AS ErrorLine,
ERROR_STATE() AS ErrorState
End Catch
END
这里的重要部分是日志之后的三个SET
语句系列。这会根据结果中的行数和查询的预期成本进行限制。行计数和查询调控器值可以是使用变量,因此也不难修改它以根据当前用户更改限制。
但是,您还应该注意,对于那些“知情”的用户来说,如果他们想要的话,很容易就会破产。在我的情况下,我认为能够不时超越一个功能。但这也是我进行日志记录的原因:超越限制的代码在日志中突出,因此我可以轻易地捕获并禁止任何人在未经我许可的情况下经常使用它。
最后,任何调用它的用户都应该只是 在denydatawriters角色,datareaders角色中,然后给予显式权限来执行这个存储过程。然后他们不能真正做任何,而是选择现有的表。
现在,我预计您的下一个问题是,您是否可以从报表生成器或管理工作室等地方自动完成此操作。不幸的是,我不认为这是可能的。您需要为它们提供某种界面,以便于调用存储过程。但我在这里可能是错的。
答案 1 :(得分:2)