いくつかの掘削後と@TheGameiswarの答えを使用して
1-
Create user user_reader without login
2-所有権チェーンを破るために、私は新しいDB作成「読み取り専用」のユーザーを作成します。所有者としてuser_reader
Create schema reader
ALTER AUTHORIZATION ON Schema::reader TO user_reader
、3-グラントselectパーミッションを持つスキーマが
をuser_readerします
GRANT SELECT TO user_reader
4 user_readerに実行許可を与えます(リーダースキーマのみ)。他のスキーマでは、ストアドプロシージャにはテーブルと同じ所有者が存在する可能性があり、所有権チェーンが破られていないため、user_readerの権限はチェックされません。
GRANT EXECUTE ON Schema::reader TO user_reader
5 user_readerのコンテキストでユーザーが記述したすべてのSQL文を実行します。これは、常に先頭に追加
public override DataTable ExecuteQuery(string query)
{
SqlConnection connection = new SqlConnection(ConnectionString);
StringBuilder readOnlyQuery = new StringBuilder();
readOnlyQuery .AppendLine("execute as user = 'user_reader';");
readOnlyQuery .AppendLine(query);
query = readOnlyQuery .ToString();
SqlCommand command = new SqlCommand(query, connection);
...Execute the command
}
TESTING FOR "ユーザー= 'user_reader' として実行" を達成するために、
CREATE TABLE [dbo].[TestTable](
[TestField] [int] NOT NULL
)
GO
CREATE PROCEDURE USP_INSERT
@input int
AS
BEGIN
INSERT INTO TestTable VALUES (@input)
END
GO
CREATE PROCEDURE reader.USP_READ
AS
BEGIN
SELECT * FROM TestTable
END
GO
CREATE PROCEDURE reader.USP_INSERT
@input int
AS
BEGIN
INSERT INTO TestTable VALUES (@input)
END
TESTING:INSERTパーミッションが拒否された
insert into TestTable VALUES (2)
オブジェクト 'TestTable'、データベース 'Test'、スキーマ 'dbo'。
select * from TestTable
OK
exec usp_read
EXECUTE権限がオブジェクトのUSP_READ '、データベース 'テスト'、スキーマ 'DBO' で拒否されました。
exec usp_insert 1
EXECUTE権限はオブジェクトのUSP_INSERT '、データベース 'テスト'、スキーマ 'DBO' で拒否されました。
exec reader.usp_insert 1
INSERT権限はオブジェクトののTestTable '、データベース 'テスト'、スキーマ 'DBO' で拒否されました。
exec reader.usp_read
OK
また、我々は、このソリューションは、私のrequiretmentsを満たしているが、おそらく、他の状況のために十分でない読者のスキーマから
select name
from sys.procedures
where SCHEMA_NAME(schema_id) = 'reader'
をすべてのストアドプロシージャを一覧表示することができます。
ロールを作成し、そのロールの作成済みストアドプロシージャに実行権を与えます。あなたのユーザを 'db_datareader'ロールと新しく作成したロールの一部にしましょう。ユーザーを他のロールの一部にしないでください。それはエースを制限するべきですが、あなたが確信が持てない場合はテストしてください。より良い答えが必要な場合は、あなたの質問が現在であるという仮説だけでなく、問題を実証できる[mcve]を提供しなければならないでしょう。 – Igor
私は問題がここにあると思う、 "ユーザーは、SQL Serverデータベースで実行されるSQL文を入力することができます"。それは信じられないほど怖いです。なぜユーザーはSQL文を入力する必要がありますか?これは許容される可能性が非常にわずかですが、非常にまれです。 –