我的用户在数据库上拥有db_datareader,db_datawriter权限。 我想将隔离级别设置为用户可以访问的DB。 我的用户需要具有哪些权限才能设置这些权限。 使用的数据库:SQL SERVER 2008
答案 0 :(得分:8)
这不是设置隔离级别:
ALTER DATABASE dbname SET ALLOW_SNAPSHOT_ISOLATION ON;
那就是改变数据库。为此,您需要为他们提供数据库的ALTER
权限:
GRANT ALTER ON DATABASE::dbname TO username;
否则会出现此错误:
Msg 5011,Level 14,State 9,Line 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