【问题标题】:Grant ReadOnly with (nolock) permission in SQL Server在 SQL Server 中授予具有 (nolock) 权限的 ReadOnly
【发布时间】:2013-07-08 23:09:03
【问题描述】:

我正在开发一个具有庞大数据库的应用程序,其中包含许多具有数十亿行的表。我有分布在全球各地的开发团队。他们需要出于各种目的访问生产数据库。他们已被授予对 DB 的只读权限。 如果您使用查询with (nolock),它工作正常。但是,如果您不使用nolock,您可以通过运行一些永无止境的查询来关闭整个应用程序。去年发生了几次,所以现在我犹豫是否授予新开发人员许可。

我知道为每个表创建一个视图with (nolock) 并仅授予这些视图的权限是一种解决方案,但不知何故我不想为此创建 200 个视图。

我正在寻找一种方法:

  1. 以一种方式授予权限,使该用户的所有查询都在没有锁定的情况下运行,或者
  2. 强制用户使用with (nolock)

我们使用的是 SQL Server 2008 R2。

PS:到目前为止,我在使用另一个基于 Oracle 的应用程序时从未遇到过这个问题,它比这个应用程序大 50 倍。

【问题讨论】:

标签: sql-server permissions sql-server-2008-r2 locking


【解决方案1】:

如果您使用的是企业版,您可以尝试使用资源管理器。设置查询执行的最长时间。这并不是您真正要求的,但它可以解决永无止境的查询问题。你可以看看here(场景二)。

您还可以查看更改数据库属性的方向 (Using Snapshot Isolation)- 这可能是您在 Oracle 中没有遇到此类问题的原因- Oracle 默认使用此功能,但对于 SQL Server,它相对较新的功能 (> =2005)。不过应该小心,因为它会影响 tempdb。

【讨论】:

  • 设置最大时间已设置,但它的值太高,无助于解决问题。如果有任何方法可以强制执行特定用户的所有查询,快照隔离将有所帮助。事实上,READ UNCOMMITTED 模式对我来说同样有用。
  • @Pankaj * 你可以设置 Read Committed Snapshot 数据库范围,所以它被用来代替 Read Committed - 我猜这对所有用户来说会更好,但当然,你应该知道得更好。 * 我不是在谈论“最大执行时间”——它用于限制查询可以使用的最大 CPU 时间。使用资源调控器,您可以为特定的组或用户设置它。
猜你喜欢
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
相关资源
最近更新 更多