SQL Server 2008 で CREATE、ALTER、DROP ステートメントへのアクセスを特定のユーザー/ログインに制限するにはどうすればよいですか?
2 に答える
このトリガーを使用できます。1 つのデータベースのみが必要な場合は、コメント付きのコード @event data を使用してロジックを記述します。
CREATE TRIGGER [permissions]
ON ALL SERVER
FOR CREATE_Table,DROP_Table,ALTER_Table,
CREATE_View,ALTER_View,Drop_View,
CREATE_Trigger,ALTER_Trigger,Drop_Trigger,
CREATE_DATABASE,DROP_DATABASE,ALTER_DATABASE,
CREATE_USER,DROP_USER,ALTER_USER,
CREATE_FUNCTION,ALTER_FUNCTION,DROP_FUNCTION,
CREATE_Procedure,ALTER_Procedure,DROP_Procedure,
CREATE_ASSEMBLY,ALTER_ASSEMBLY,DROP_ASSEMBLY,
CREATE_ROLE,ALTER_ROLE,DROP_ROLE
AS
BEGIN
-- DECLARE @Eventdata XML,@ActionType varchar(100),@DataBase varchar(100)
--SET @Eventdata = EVENTDATA()
--SET @ActionType=@Eventdata.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)')
-- SET @DataBase=@Eventdata.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'nvarchar(100)')
IF SYSTEM_USER IN ('user')
BEGIN
RAISERROR ('not allowed.', 16, 1 );
ROLLBACK;
END
END
SQL 権限階層は、インスタンス レベルのログインから始まり、データベース レベルのユーザーがインスタンスのログインにマップされます。
ユーザーとそれに関連付けられたログインには、サーバー ロールとデータベース ロール (これらは、アクセス許可の管理を簡素化する原則とセキュアブルのコレクション) を介して明示的に付与するか、オブジェクトに直接アクセス許可を付与することによってアクセス許可を付与するまで、アクセス許可はありません。
SQL Server では、DENY は GRANT をオーバーライドするため、問題のオブジェクトに対して DDL を発行するアクセス許可をユーザーに付与するロールにユーザーが既にいる場合は、問題の特定のオブジェクトへのアクセス許可を拒否できます。テーブルへの変更権限の拒否に基づく、この構文の例は次のとおりです。
DENY ALTER ON OBJECT::dbo.MyTable TO MyUser
もちろん、GUIからもこれを行うことができます。SSMS で、[データベース] > [MyDatabase] > [Security] > [Users] をドリルスルーし、問題のユーザーのプロパティを開き、ここで割り当てを変更します。
データベースの世界におけるセキュリティは非常に重要です。アドホックな方法でアクセス許可を設定するのではなく、Windows グループのサーバー ロールとデータベース ロールを使用してアクセス許可を管理する方法を調査することを強くお勧めします。また、完全に文書化されたセキュリティ ポリシーと、組織内の正確なセキュリティ構造を詳述した例外文書をお勧めします。これらの作業文書を保持することで、誰が何を実行できるかを簡単に追跡できます。これにより、否認不可の問題を回避し、監査を容易にします。
これが役立つことを願っています。