2

DB に対して db_datareader、db_datawriter 権限を持つユーザーがいます。ユーザーがアクセスできる DB に分離レベルを設定したいと考えています。ユーザーがこれらを設定できるようにするために必要なアクセス許可は何ですか? 使用DB:SQL SERVER 2008

4

1 に答える 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

もう 1 つのアイデアは、単純に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 に答える