2つのスキーマcoreとdynaを持つデータベースがあります。
データベースの更新にdacpacsを使用しています。ユーザーアカウントがcoreスキーマのテーブル(など)とのみ対話できるようにしたい。
これは、dynaスキーマのテーブル(10k +)が動的に生成され、dacpacによって更新されないためですが、dacpackはすべてのテーブルをチェックする必要があります更新されるかどうかを確認します。これにより、デプロイメントのパフォーマンスが低下します。 (製品版では6時間以上vsテストでは10分)
Dacpacsをデプロイできるようにするには、ユーザーはdbcreator(またはsysadmin)の役割を持っている必要があります。
展開のためにsysadminロールを持つユーザーを使用してきましたが、次の場合は疑問に思っています。dbcreatorロールでユーザーを作成できますが、dynaスキーマ?
したがって、次のことは可能ですか?dbcreatorロールを持つユーザーの特定のスキーマへのアクセスを拒否しますか?
Dbcreatorロールを持つユーザーの特定のスキーマへのアクセスを拒否しますか?
これに答える前に、ダニエルが彼の答えで何を回避したかを述べたいと思います。 dbcreatorロールを持つユーザーがいません。これは、dbcreatorロールのメンバーであるログインです。 dbcreatorはサーバーレベルのロールであるため。
マップされたログインがdbcreatorサーバーレベルロールのメンバーであるユーザー拒否制御(スキーマの変更、削除、実行、挿入、更新の選択など)特権を持つことができます。
あなたの質問のデモをしてみましょう。
管理者権限を持つアカウントでログインします。このステートメントを実行します。
USE [master]
GO
CREATE LOGIN [testDBcreator] WITH PASSWORD=N'testDBcreator', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
ALTER SERVER ROLE [dbcreator] ADD MEMBER [testDBcreator]
GO
CREATE DATABASE [testDBcreator]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'testDBcreator', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\DATA\testDBcreator.mdf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
LOG ON
( NAME = N'testDBcreator_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\DATA\testDBcreator_log.ldf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
GO
USE [testDBcreator]
GO
CREATE USER [testDBcreator] FOR LOGIN [testDBcreator] WITH DEFAULT_SCHEMA=[dbo]
GO
CREATE SCHEMA schema1
GO
CREATE SCHEMA schema2
GO
CREATE TABLE schema1.table1 (id int)
GO
INSERT INTO schema1.table1
VALUES (1),(2)
GO
CREATE TABLE schema2.table2 (id int)
GO
INSERT INTO schema2.table2
VALUES (3),(4)
GO
USE [testDBcreator]
GO
ALTER ROLE [db_owner] ADD MEMBER [testDBcreator]
GO
DENY CONTROL ON SCHEMA::schema1 TO testDBcreator
GO
接続を変更してtestDBcreatorでログインし、これを実行します。
USE [testDBcreator]
GO
SELECT * FROM schema1.table1
GO
次のエラーが発生します。
メッセージ229、レベル14、状態5、行3オブジェクト 'table1'、データベース 'testDBcreator'、スキーマ 'schema1'に対するSELECT権限が拒否されました。
これを実行します。
USE [testDBcreator]
GO
SELECT * FROM schema2.table2
GO
期待どおりの結果が得られます。
このログインで.DACPACを実行できるかどうかはわかりません。
dbcreator
はサーバーレベルの役割であり、そのメンバーはインスタンス上で 作成、変更、削除、および復元 データベースを実行できます。
直感的に-そして、あなたのdacpacを見たことがない-私はdb_datareader
データベースロールのメンバーシップで問題の実行ユーザーを許可します。これにより、すべてのオブジェクトとCONTROL SCHEMA ON SCHEMA::core
を表示できるため、作成、変更できます必要に応じて、コアスキーマにオブジェクトをドロップします。
そこから、dacpacの実行中に発生するアクセス許可エラーの種類を監視します。あなたの質問から判断すると、データベースを変更または削除/再作成する必要があると思います-その場合は、dacpacを構築しているときに修正できるかどうかを確認してください。