我有一个对数据库具有 db_datareader、db_datawriter 权限的用户。我想将隔离级别设置为用户有权访问的数据库。我的用户需要哪些权限才能设置这些权限。使用的数据库:SQL SERVER 2008
问问题
9625 次
1 回答
9
这不是设置隔离级别:
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
于 2013-09-05T22:17:26.507 回答