首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在数据库中启用快照隔离需要哪些用户权限?

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

Stack Overflow用户
提问于 2013-09-06 05:03:38
回答 1查看 9.6K关注 0票数 2

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-06 06:17:27

这不是设置隔离级别:

代码语言:javascript
复制
ALTER DATABASE dbname SET ALLOW_SNAPSHOT_ISOLATION ON;

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

代码语言:javascript
复制
GRANT ALTER ON DATABASE::dbname TO username;

否则,您将收到此错误:

消息5011,级别14,状态9,第1行用户没有权限更改数据库'dbname',该数据库不存在,或者该数据库未处于允许access checks.Msg 5069,级别16,状态1,第1行数据库语句失败的状态。

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

代码语言:javascript
复制
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权限):

代码语言:javascript
复制
GRANT EXEC ON dbo.SetIsolationLevel TO username;
GO

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

代码语言:javascript
复制
EXECUTE AS USER = 'username';
GO
EXEC dbo.SetIsolationLevel;
GO
REVERT;
GO

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

代码语言:javascript
复制
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';

结果:

代码语言:javascript
复制
ON
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18645930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档