2016-07-26 26 views
0

SQL Serverバックエンドを持つC#で書かれたアプリケーションがあります。パワーユーザーは、システムデータベースに対して独自のSQLスクリプトを作成して実行することで、レポートを作成することができます。読み取り専用アクセスでSQL Serverデータベースを開きます -

明らかに、ユーザーがデータベース内のデータを簡単に変更できるように、システムが接続に使用するSQL Serverユーザーは使用できません。私は、接続をC#アプリケーションから読み取り専用として開くことができないことを知っているので、データベースに対して読み取り専用の権限を持つユーザーを使用する必要があります。

私は、報告目的で接続するユーザーがデータベースへの読み取り専用アクセス権を持っているかどうかをテストする予定でした。アクセスが読み取り専用の場合はクエリが実行され、そうでない場合は実行が拒否されます。これをC#アプリケーションまたはT-SQLを使用してテストするにはどうすればよいですか?

+0

これは実際にアプリケーションのセキュリティをどのように実装するかによって異なります。独自のロールを作成して、たとえば読み取り専用のアカウント(またはグループ)を使用することができます。 SQLのセキュリティとトラップの例外を使用することができます。そのインターフェイスを使用している場合は、そこで管理されているSSRSを使用している場合。可能であれば、組み込みのセキュリティを使用してさまざまな例外を探すのが好きです。 –

+1

これは非常に悪い考えです。基本的には、「Power Users」にはデータベースサーバーを苦労してクエリを記述しにくくする機能があります。 – Kevin

+0

ケビン:しかし、これらのクエリを実行するために選択されたいくつかの選択肢は、彼らが何をしているかを知るのに十分知識があります。さらに、システム内のどのような場合でも、大量のデータがないため、クエリが単純なものであっても、DB全体のすべてのデータを選択してもパフォーマンスに影響を与える可能性があります。私が望むのは、パワーユーザーが選択した接続が読み取り専用アクセス権を持っていることを確認することだけです。 – Daniel

答えて

1

データベースのdb_datareader以外のユーザーマッピングがあるかどうかを確認できます。私はgood TSQL queryを見つけましたが、照合の競合のために私のシステム上で実行できません。ここに私のために動くそのポストからの更新されたバージョンがあります。 SQL Server Management Studioで実行して、返されるデータのアイデアを得ることができます。

DECLARE @name SYSNAME = N'ReadonlyUserNameHere'; -- input param, presumably 

DECLARE @sql NVARCHAR(MAX) = N''; 

SELECT @sql += N'UNION ALL SELECT N''' + REPLACE(name,'''','''''') + ''', 
    p.name COLLATE DATABASE_DEFAULT, p.default_schema_name COLLATE DATABASE_DEFAULT, STUFF((SELECT N'','' + r.name 
    FROM ' + QUOTENAME(name) + N'.sys.database_principals AS r 
    INNER JOIN ' + QUOTENAME(name) + N'.sys.database_role_members AS rm 
    ON r.principal_id = rm.role_principal_id 
    WHERE rm.member_principal_id = p.principal_id 
    FOR XML PATH, TYPE).value(N''.[1]'',''nvarchar(max)''),1,1,N'''') 
FROM sys.server_principals AS sp 
LEFT OUTER JOIN ' + QUOTENAME(name) + '.sys.database_principals AS p 
ON sp.sid = p.sid 
WHERE sp.name = @name ' 
FROM sys.databases WHERE [state] = 0; 

SET @sql = STUFF(@sql, 1, 9, N''); 

PRINT @sql; 
EXEC master.sys.sp_executesql @sql, N'@name SYSNAME', @name; 

C#のクエリを書き換えるときは、必ずパラメータ化クエリを使用してユーザー名を注入してください。

+0

ありがとうございました。私は出力で作業することができます。 – Daniel

関連する問題