我有一个用C#编写的应用程序,它有一个SQL Server后端。我们将通过针对系统数据库编写和执行自己的SQL脚本,为高级用户提供创建报告的能力。
现在,显然,我无法使用系统用于连接的SQL Server用户,因为用户可以轻松地修改数据库中的数据。我知道我不能强制从C#应用程序以只读方式打开连接,因此我必须使用对数据库具有只读权限的用户。
我计划测试连接报告目的的用户是否只读取数据库的访问权限。如果访问是只读的,则将执行查询,否则将拒绝执行。如何从C#应用程序或使用T-SQL进行测试?
答案 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#查询时,请务必使用参数化查询来注入用户名。