CIログインに適切なGRANT権限を割り当てようとしています。これにより、次のことが可能になります。
しかし、SQL Server 2012 GRANT CREATE ANY DATABASE
は、作成のみを許可し、データベースの変更と削除は許可しません(新規データベースは作成者をdboとして保持しないため)。
Sysadminロールを与えるだけではセキュリティリスクが高すぎるので、他に必要なGRANTSは何か考えられますか?
まずする必要があります
データベース作成権限を持つログインを作成します。ログインではデータベースを削除できないことに注意してください。
USE [master]
GO
CREATE LOGIN [Kin] WITH PASSWORD=N'somePassw0rd', DEFAULT_DATABASE=[master],
DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
use [master]
GO
-- Grant create any database, but not drop or alter any database
GRANT CREATE ANY DATABASE TO [Kin]
GO
変更または削除する権限を付与するデータベースにログインをマップします。
-- for drop database, you just need db_owner
USE [test_drop]
GO
CREATE USER [Kin] FOR LOGIN [Kin]
GO
ユーザーをdb_owner
ロールに追加します。
EXEC sp_addrolemember 'db_owner', 'Kin'
次に、作成/変更および削除するためにテストします。
EXECUTE AS LOGIN = 'Kin'
create database test_drop
EXECUTE AS LOGIN = 'Kin'
use test_drop
create table test (fname char(1))
EXECUTE AS LOGIN = 'Kin'
select * from test
EXECUTE AS LOGIN = 'Kin'
alter database test_drop
set offline
EXECUTE AS LOGIN = 'Kin'
alter database test_drop
set online
EXECUTE AS LOGIN = 'Kin'
drop database [test_drop]
他のいくつかのdbを削除してみてください:
EXECUTE AS LOGIN = 'Kin'
alter database [test_kin]
set online
以下はエラーです:
メッセージ5011、レベル14、状態9、行2ユーザーにデータベース「test_kin」を変更する権限がないか、データベースが存在しないか、データベースがアクセスチェックを許可する状態にありません。メッセージ5069、レベル16、状態1、行2のALTER DATABASEステートメントが失敗しました。
「データベースのCONTROL権限、ALTER ANY DATABASE権限、またはdb_owner固定データベースロールのメンバーシップが必要です。」
これを処理するための可能な方法は、db_owner
ロールの一部としてモデルデータベースにユーザーを追加することです。 SQL Serverで作成されたすべてのデータベースはそのコピーであり、すべてのユーザー、オブジェクト、許可などを保持します。これは、新しいデータベースが作成されるたびに、CIユーザーをdb_ownerロールに保持し、削除/変更する権限を持つことを意味しますそのデータベース。もちろん、欠点は、CIプロセスの一部として作成されていないデータベースにも引き継がれることです。これが不要な場合は、手動で削除する必要があります。
それ以外の場合は、この開始を制限するためのハードルが非常に複雑になるため、CIログインにはデータベースを作成および削除するための十分な権限が必要です。