我可以在SQL Server中强制用户进行某些设置吗?

时间:2009-10-01 14:44:00

标签: sql-server sql-server-2000 interface

我有一群用户在运行SQL Server的数据库中进行临时查询。有时,有人会运行一个查询,在检索10MM行时会长时间锁定系统。

特定登录连接时是否可以设置一些选项? e.g:

  • 事务隔离级别
  • max rowcount
  • 查询超时

如果在SQL Server 2000中无法做到这一点,是否可以在其他版本中使用?据我所知,资源调控器不会给你这样的控制(它只是让你管理内存和CPU)。

我意识到用户可以自己做很多事情,但如果我可以从每个用户的服务器控制它,那就太棒了。

显然我想让用户远离直接的桌面/视图访问,但目前这不是一个选项。

2 个答案:

答案 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)

在SQL Server 2005和2008中,您可以向数据库添加一个LOGIN触发器,该触发器可以根据连接设置更改连接设置。但是,您需要非常小心这些因为错误或触发器中的错误可能导致每个人都被锁定。

在SQL Server 2000中没有类似的东西。


我只是想补充一点,如果Joel的方法适合你,那么我会强烈鼓励这种方法超过我的方法,因为登录触发器是一个巨大而危险的手榴弹,可以解决这个问题。

如果您仍然真的想要这样做,here是一篇很好的文章,演示了如何使用它们。然而,更重要的是here,如果您的登录触发器将所有人锁定,那么它有关于该怎么做的重要说明。