在数据库中启用快照隔离需要哪些用户权限



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

这不是设置隔离级别:

ALTER DATABASE dbname SET ALLOW_SNAPSHOT_ISOLATION ON;

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

GRANT ALTER ON DATABASE::dbname TO username;

否则,您会收到此错误:

Msg 5011,级别 14,状态 9,第 1 行
用户没有更改数据库"dbname"的权限,数据库不存在,或者数据库未处于允许访问检查的状态。
Msg 5069,级别 16,状态 1,第 1 行
更改数据库语句失败。

现在,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

最新更新