以只读访问权限打开 SQL 服务器数据库 - 确保
Open SQL Server database with read-only access - making sure
我有一个用 C# 编写的应用程序,它有一个 SQL 服务器后端。我们将使高级用户能够通过针对系统数据库编写和执行他们自己的 SQL 脚本来创建报告。
现在,很明显,我不能使用系统用于连接的 SQL 服务器用户,因为这些用户可以很容易地修改数据库中的数据。我知道我不能强制从 C# 应用程序以只读方式打开连接,因此我必须使用对数据库具有只读权限的用户。
我正计划测试以报告为目的连接的用户是否对数据库具有只读访问权限。如果访问是只读的,则查询将被执行,否则执行将被拒绝。如何从 C# 应用程序或使用 T-SQL?
对此进行测试
您可以检查用户是否有 任何 用户映射而不是 db_datareader 用于相关数据库。我找到了 good TSQL query,但由于排序规则冲突,它无法在我的系统上找到 运行。这是 post 对我来说 运行 的更新版本。您可以在 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# 重写查询时,请务必使用参数化查询来注入用户名。
我有一个用 C# 编写的应用程序,它有一个 SQL 服务器后端。我们将使高级用户能够通过针对系统数据库编写和执行他们自己的 SQL 脚本来创建报告。
现在,很明显,我不能使用系统用于连接的 SQL 服务器用户,因为这些用户可以很容易地修改数据库中的数据。我知道我不能强制从 C# 应用程序以只读方式打开连接,因此我必须使用对数据库具有只读权限的用户。
我正计划测试以报告为目的连接的用户是否对数据库具有只读访问权限。如果访问是只读的,则查询将被执行,否则执行将被拒绝。如何从 C# 应用程序或使用 T-SQL?
对此进行测试您可以检查用户是否有 任何 用户映射而不是 db_datareader 用于相关数据库。我找到了 good TSQL query,但由于排序规则冲突,它无法在我的系统上找到 运行。这是 post 对我来说 运行 的更新版本。您可以在 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# 重写查询时,请务必使用参数化查询来注入用户名。