我有一个用户谁有db_datareader,数据库上的db_datawriter权限。我想将隔离级别设置为用户有权访问的数据库。我的用户需要什么权限才能设置这些权限。使用的数据库: SQL SERVER 2008
发布于 2013-09-06 06:17:27
这不是设置隔离级别:
ALTER DATABASE dbname SET ALLOW_SNAPSHOT_ISOLATION ON;这就是在改变数据库。为此,您需要为他们提供对数据库的ALTER权限:
GRANT ALTER ON DATABASE::dbname TO username;否则,您将收到此错误:
消息5011,级别14,状态9,第1行用户没有权限更改数据库'dbname',该数据库不存在,或者该数据库未处于允许access checks.Msg 5069,级别16,状态1,第1行数据库语句失败的状态。
现在,ALTER要么全有,要么全无--您不能使用它来允许他们更改allow snapshot设置,而不允许更改其他设置,如强制参数化、兼容级别等。不过,您可以更精细地执行此操作;也许您可以创建一个执行以下操作的存储过程:
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';结果:
ONhttps://stackoverflow.com/questions/18645930
复制相似问题