在数据库中启用快照隔离所需的用户权限是什么?

use*_*433 2 database isolation-level sql-server-2008

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

Aar*_*and 8

这不是设置隔离级别:

ALTER DATABASE dbname SET ALLOW_SNAPSHOT_ISOLATION ON;
Run Code Online (Sandbox Code Playgroud)

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

GRANT ALTER ON DATABASE::dbname TO username;
Run Code Online (Sandbox Code Playgroud)

否则你会收到此错误:

消息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
Run Code Online (Sandbox Code Playgroud)

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

GRANT EXEC ON dbo.SetIsolationLevel TO username;
GO
Run Code Online (Sandbox Code Playgroud)

您可以通过以相同方式登录或EXECUTE AS直接使用该功能来模拟调用此存储过程:

EXECUTE AS USER = 'username';
GO
EXEC dbo.SetIsolationLevel;
GO
REVERT;
GO
Run Code Online (Sandbox Code Playgroud)

另一个想法是简单地将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';
Run Code Online (Sandbox Code Playgroud)

结果:

ON
Run Code Online (Sandbox Code Playgroud)