SqlCommand是否可以实现只读行为?

11

使用 System.Data.SqlClient 访问 SQL Server 数据库,是否可以强制执行只读权限?

我想允许可信用户在网站中编写自己的 SELECT 语句。

不,我不是在钓鱼!显而易见的解决方案是在数据库中创建一个只读用户,并在连接字符串中使用这些凭据,而且只有傻瓜才会接受来自网页的 SQL 语句。这是一个用户部署问题,我不相信其他人能正确设置它,也不想编写代码来检查只读连接字符串是否只读。

一种解决方案是解析 SQL 并验证它是否为只读命令,或者做类似的事情。我想要做的是像这样的事情:

SqlConnection conn = new SqlConnection(myConnectionString, Flags.Readonly)

更新 给定一个具有SA权限的连接字符串,“create user blah with password=xxx”“use my-db”“create login blah”“grant select on mytable to blah”。然后创建一个新的连接字符串。

4个回答

8

在SQL Server中创建一个新的登录账号,并且只赋予该账号你想要的表格权限。然后在连接字符串中让应用程序使用该登录账号。你在帖子中提到这是一个显而易见的解决方案,但我不明白为什么你不想以这种方式来实现。


1
是的,这是最简单的方法 - 在数据库上处理权限,然后无论用户如何访问数据,他都不能损坏任何内容。 - marc_s
谢谢 - 我会这样做,但我想知道是否有可能有一个仅代码的解决方案。 - Dead account

6
您可以使用事务并始终进行回滚吗?(但请确保执行的SQL不会提交)

3

没有内置的功能来确保最终用户的操作不会产生副作用。虽然在您的情况下可能很简单,但通用实现将非常复杂,甚至是不可能的。如果select语句使用具有副作用的UDF会怎么样呢?


3
执行 ("DR" + "OP" + " TABLE " + "Users")。 - KM.

2

创建另一个数据库,可能恢复昨晚的备份,使其为一天前的状态。仅允许用户访问此数据库。这样一来,用户就不能通过糟糕的查询拖慢生产速度,如果安全性失败并进行更改,也不会对任何东西造成真正的损害。


您可能可以设置更复杂的镜像方案,以便自动执行此操作并更频繁地更新。 "报告"数据库并不罕见。 - Denise Skidmore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接