使用只读访问权限打开SQL Server数据库 - 确保

时间:2016-07-26 20:11:51

标签: c# sql-server database tsql access-rights

我有一个用C#编写的应用程序,它有一个SQL Server后端。我们将通过针对系统数据库编写和执行自己的SQL脚本,为高级用户提供创建报告的能力。

现在,显然,我无法使用系统用于连接的SQL Server用户,因为用户可以轻松地修改数据库中的数据。我知道我不能强制从C#应用程序以只读方式打开连接,因此我必须使用对数据库具有只读权限的用户。

我计划测试连接报告目的的用户是否只读取数据库的访问权限。如果访问是只读的,则将执行查询,否则将拒绝执行。如何从C#应用程序或使用T-SQL进行测试?

1 个答案:

答案 0 :(得分: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#查询时,请务必使用参数化查询来注入用户名。