如何为SQL Server登录强制Nolock提示
有谁知道对特定用户发出的所有交易强制使用nolock提示的方法?我想为支持团队提供登录名以查询生产系统,但我想通过强制他们所做的任何事情来保护它。我正在使用SQL Server 2005.
解决方案
回答
我们可以为支持团队创建一个受限用户,然后使用nolock-hint编写存储过程或者视图。然后仅授予对这些访问的权限,而不直接授予表选择访问权限。
回答
正如Espo所暗示的那样,我很确定没有直接的方法可以完成我们要问的事情。如他所说,我们可以通过限制用户对仅具有内置NOLOCK编码的proc的访问权限来实现此目的。
回答
我们可以将支持人员的SQL Management Studio配置为将默认事务隔离级别设置为READ UNCOMMITTED(工具->选项->查询执行-> SQL Server->高级)。这在功能上与对所有内容使用NOLOCK提示相同。
缺点是我们必须为支持团队的每个成员执行此操作,并且他们将能够更改其SQL Management Studio上的配置。
回答
不幸的是,限制用户使用SP不能达到目的。我希望可以通过某种方式让他们查询所有内容,从而提高他们的故障排除技能。感谢帮助。
回答
这是一种痛苦而棘手的方式,但这就是我们在工作的地方所采取的措施。我们还使用经典的asp,因此我们使用内联sql调用。我们实际上将sql调用包装在一个函数中(在这里我们可以检查特定用户),并在调用开始处添加" SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"。
我认为从功能上讲,这与无锁提示相同。抱歉,我没有一个纯SQL的答案,如果我们能找到一个好的方法,我很想听听。
回答
好的,我们需要在此说明我们要做什么。
如果我们试图减少对数据库的锁定,并可能向支持用户提供可能从未真正提交到数据库中的数据。在允许他们将所需内容写入数据库的同时,nolock是必经之路。我们将获得额外的好处,即用户仍然可以使用SET TRANSACTION ISOLATION LEVEL命令来提高其隔离级别。
如果要限制它们对数据库运行时可能造成的损害,请查看实现安全性,确保仅允许它们对表进行读取访问,并考虑剥离对存储的proc和函数的所有访问。
我发现在堆栈溢出时严重误解了NOLOCK。