データベースの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#のクエリを書き換えるときは、必ずパラメータ化クエリを使用してユーザー名を注入してください。
これは実際にアプリケーションのセキュリティをどのように実装するかによって異なります。独自のロールを作成して、たとえば読み取り専用のアカウント(またはグループ)を使用することができます。 SQLのセキュリティとトラップの例外を使用することができます。そのインターフェイスを使用している場合は、そこで管理されているSSRSを使用している場合。可能であれば、組み込みのセキュリティを使用してさまざまな例外を探すのが好きです。 –
これは非常に悪い考えです。基本的には、「Power Users」にはデータベースサーバーを苦労してクエリを記述しにくくする機能があります。 – Kevin
ケビン:しかし、これらのクエリを実行するために選択されたいくつかの選択肢は、彼らが何をしているかを知るのに十分知識があります。さらに、システム内のどのような場合でも、大量のデータがないため、クエリが単純なものであっても、DB全体のすべてのデータを選択してもパフォーマンスに影響を与える可能性があります。私が望むのは、パワーユーザーが選択した接続が読み取り専用アクセス権を持っていることを確認することだけです。 – Daniel