【问题标题】:What are the user permissions needed to enable snapshot isolation in a DB?在数据库中启用快照隔离需要哪些用户权限?
【发布时间】:2013-09-09 20:30:51
【问题描述】:

我有一个用户在数据库上拥有 db_datareader、db_datawriter 权限。 我想将隔离级别设置为用户有权访问的数据库。 我的用户需要哪些权限才能设置这些权限。 使用的数据库:SQL SERVER 2008

【问题讨论】:

  • 是的,我试图用只有上述权限的用户设置隔离级别,它抛出了权限不足的错误

标签: database sql-server-2008 isolation-level


【解决方案1】:

这不是设置隔离级别:

ALTER DATABASE dbname SET ALLOW_SNAPSHOT_ISOLATION ON;

那是在改变数据库。为此,您需要为他们提供数据库上的ALTER 权限:

GRANT ALTER ON DATABASE::dbname TO username;

否则你会得到这个错误:

消息 5011,第 14 级,状态 9,第 1 行
用户无权更改数据库“dbname”,数据库不存在,或数据库未处于允许访问检查的状态。
消息 5069,第 16 层,状态 1,第 1 行
ALTER DATABASE 语句失败。

现在,ALTER 要么全有,要么全无 - 您不能使用它来允许他们更改允许快照设置,但不能更改强制参数化、兼容性级别等其他设置。不过,您可以更精细地执行此操作;也许您可以创建一个执行以下操作的存储过程:

CREATE PROCEDURE dbo.SetIsolationLevel
WITH EXECUTE AS OWNER
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @sql NVARCHAR(MAX) = N'ALTER DATABASE ' 
      + QUOTENAME(DB_NAME())
      + ' SET ALLOW_SNAPSHOT_ISOLATION ON;';

  EXEC sp_executesql @sql;
END
GO

现在您只需授予用户 EXEC 对该过程的权限,您的用户现在可以调用该过程(而不是显式地使用 ALTER DATABASE 命令,而不是给予他们完整的 ALTER DATABASE 权限):

GRANT EXEC ON dbo.SetIsolationLevel TO username;
GO

您可以通过以他们的身份登录或直接使用EXECUTE AS 功能来模拟他们调用此存储过程:

EXECUTE AS USER = 'username';
GO
EXEC dbo.SetIsolationLevel;
GO
REVERT;
GO

另一个想法是简单地将model 数据库设置为具有此设置,而不是为您的用户创建的任何新数据库将自动继承它,然后您不必担心让他们打开它。

ALTER DATABASE model SET ALLOW_SNAPSHOT_ISOLATION ON;
GO
CREATE DATABASE splunge;
GO
SELECT snapshot_isolation_state_desc FROM sys.databases WHERE name = N'splunge';

结果:

ON

【讨论】:

  • 我正在尝试通过 JDBC 程序设置隔离级别。该程序获取用户名和密码,使用它们进行连接,然后尝试运行 alter 语句。 ALTER DATABASE SET ALLOW_SNAPSHOT_ISOLATION ON;
  • 这与您的问题所说的不同。您的问题涉及设置隔离级别。您实际上是在谈论更改数据库属性。
  • 对不起,我确实在尝试设置隔离级别。这些是我尝试运行的 2 个语句: ALTER DATABASE SET ALLOW_SNAPSHOT_ISOLATION ON; ALTER DATABASE SET READ_COMMITTED_SNAPSHOT ON;但是当我运行这些时,我最终会遇到您上面提到的与权限相关的错误。
  • @user811433 再次,您设置隔离级别的尝试没有失败;您尝试设置数据库使用某个隔离级别的能力失败。我只是为您提供了三种解决该错误的替代方法:授予用户更改数据库,创建一个存储过程,代表他们充当 dbo 来设置设置,或者让数据库在从模型创建时继承该设置。虽然我确信可能还有其他方法可以到达您需要的位置,但这些选择有什么问题?您预计还有多少选择?
猜你喜欢
  • 2011-01-01
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 2011-02-11
  • 2012-10-09
  • 2014-08-28
  • 1970-01-01
相关资源
最近更新 更多