[英]Open SQL Server database with read-only access - making sure
我有一个用C#编写的具有SQL Server后端的应用程序。 我们将使高级用户能够通过针对系统数据库编写和执行自己的SQL脚本来创建报告。
现在,显然,我不能使用系统用于连接的SQL Server用户,因为这些用户将很容易能够修改数据库中的数据。 我知道我不能强制从C#应用程序以只读方式打开连接,因此我必须使用对数据库具有只读特权的用户。
我正在计划测试与报表目的联系的用户是否具有对数据库的只读访问权限。 如果访问为只读,则将执行查询,否则将拒绝执行。 如何从C#应用程序或使用T-SQL对此进行测试?
您可以检查用户是否具有比拥有db_datareader有问题的数据库以外的任何用户映射。 我找到了一个很好的TSQL查询,但是由于排序规则冲突,它无法在我的系统上运行。 这是为我运行的帖子的更新版本。 您可以在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#查询时,请确保使用参数化查询来注入用户名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.