Sql server 我可以在SQL Server中按用户强制执行某些设置吗?

Sql server 我可以在SQL Server中按用户强制执行某些设置吗?,sql-server,sql-server-2000,interface,Sql Server,Sql Server 2000,Interface,我有一群用户在运行SQL Server的数据库中进行特殊查询。偶尔有人会运行一个查询,在检索10MM行时将系统锁定很长一段时间 当特定登录连接时,是否可以设置一些选项?e、 g: 事务隔离级别 最大行数 查询超时 如果这在SQL Server 2000中不可能,那么在其他版本中是否可能?据我所知,资源调控器并没有像这样给你控制权(它只是让你管理内存和CPU) 我意识到用户自己可以做很多事情,但如果我能从服务器上控制每个用户,那就太棒了 显然,我想让用户远离直接的表/视图访问,但目前这不是一个

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

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

  • 事务隔离级别
  • 最大行数
  • 查询超时
如果这在SQL Server 2000中不可能,那么在其他版本中是否可能?据我所知,资源调控器并没有像这样给你控制权(它只是让你管理内存和CPU)

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


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

您当然可以限制查询结果。我这样做是为了使用一个看起来像这样的存储过程:

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
语句系列。此限制基于结果中的行数和查询的预期成本。rowcount和query调控器值可以是use变量,因此修改它们以基于当前用户更改限制也不难

然而,你也应该注意到,对于那些“知情”的用户来说,如果他们愿意的话,他们很容易摆脱这种状态。在我的例子中,我认为能够时不时地跳过一个特征的限制。但这也是我做日志记录的原因:日志中突出了超越限制的代码,因此我可以很容易地捕获并禁止任何人在未经我允许的情况下频繁这么做

最后,调用此函数的任何用户都应仅处于denydatawriters角色、datareaders角色中,然后授予仅执行此存储过程的显式权限。然后,他们除了在现有表上进行选择之外,实际上什么都做不了


现在,我想问您的下一个问题是,您是否可以从报表生成器或ManagementStudio之类的地方将其自动化。不幸的是,我认为那是不可能的。您需要为它们提供某种接口,使调用存储过程变得容易。但是我可能错了。

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

SQLServer2000中没有这样的版本


我只是想补充一句,如果Joel的方法对你有效,那么我强烈建议你使用这种方法,而不是我的方法,因为登录触发器是解决这个问题的一颗巨大而危险的手榴弹


如果您仍然真的想使用它们,这是一篇演示如何使用它们的好文章。更重要的是,如果你的登录触发器将所有人都锁在门外,那么哪一个具有关键的操作说明。

@Joel:那么,我可以让用户使用这个薄型包装器,而不是让用户直接对数据库运行查询?我喜欢,谢谢!是的,你答对了我的下一个问题。+1谢谢你,这看起来很有希望。不过,举个例子会让它受益匪浅。