【问题标题】:Can I force certain settings by user in SQL Server?我可以在 SQL Server 中强制用户进行某些设置吗?
【发布时间】:2009-10-01 14:43:59
【问题描述】:

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

是否可以在特定登录连接时设置一些选项?例如:

  • 事务隔离级别
  • 最大行数
  • 查询超时

如果这在 SQL Server 2000 中不可行,是否可以在其他版本中实现?据我所知,资源管理器并没有给你这样的控制权(它只是让你管理内存和 CPU)。

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

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

【问题讨论】:

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


    【解决方案1】:

    您当然可以限制查询结果。我正在为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 角色中,然后被授予执行这个存储过程的明确权限。然后他们就不能真正做任何事情,只能在现有表上进行选择。

    现在,我预计您的下一个问题是您是否可以从报表生成器或管理工作室等地方自动执行此操作。不幸的是,我认为这是不可能的。您需要为他们提供某种接口,以便于调用您的存储过程。但我在这里可能是错的。

    【讨论】:

    • @Joel:因此,与其让用户直接对数据库运行查询,我可以让他们使用这个瘦包装器吗?我喜欢,谢谢!是的,你解决了我的下一个问题。
    【解决方案2】:

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

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


    我只是想补充一点,如果 Joel 的方法适合您,那么我强烈建议您使用该方法而不是我的方法,因为登录触发器是解决这个问题的一个巨大而危险的手榴弹。

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

    【讨论】:

    • +1 谢谢你,它看起来很有希望。不过,它会从一个例子中受益。
    猜你喜欢
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多