。净。运行sql查询时防止修改数据

时间:2014-07-16 09:24:57

标签: .net sql-server

有没有办法从C#/ VB.Net中的代码在MS SQL Server上执行sql并保证数据不会被更改?我只需要加载数据,但不能确定sql表达式不包含insert / update / delete语句。我尝试过SqlDataAdapter和SqlCommand.ExecuteReader(),但它们允许修改数据。 我知道程序只是向sql server发送命令而不检查它。 我现在看到的一个选项是使用只读用户连接。它只需要很少的代码更改。但它并没有完全保存,因为连接字符串存储在配置文件中并且可以轻松更改(我不能使用硬编码值)。 一些更复杂的方法是解析sql以检查它是否实际上是查询。我不确定是否有一些现成可靠的解决方案。

有没有办法阻止运行可以修改代码数据的SQL?

4 个答案:

答案 0 :(得分:1)

您可以将用户创建为db_datareader群组成员,db_datareader个用户,只具有阅读权限,现在可以形成您可以连接到C#的{​​{1}}应用使用此用户

答案 1 :(得分:1)

如何与没有任何允许他们修改数据的权限的SQL用户一起执行?我在这里谈论SQL权限。然后无论你传递什么代码,当它试图修改数据时,它都会被拒绝并返回异常。

话虽如此,我永远不会让别人为我查询。我只公开他们调用的方法并将他们的输入作为SQL参数发送到我自己写的脚本(我,我的团队,我的公司,你理解我的意思)。

答案 2 :(得分:1)

使用交易。

  • 开始交易
  • 运行SQL
  • 回滚交易

我在过去已经完成了运行单元测试的过程,因此测试数据库不会被任何测试更改。

查看SqlTransactiondistributed transactions

但是这不会阻止删除表等,所以如果你不信任正在运行的SQL,你仍然需要SQL用户拥有有限的权限。

另一个需要考虑的选择是数据库快照,但它们仅用于只有一个进程访问SQL服务器,因此非常适合单元测试,但可能不适用于您正在进行的操作。

答案 3 :(得分:0)

您可以使用以下方法:

  1. 只有您的表的读权限。
  2. 具有用于逻辑锁定表的特定行的标志字段(通过使用而不是insert,update和deleted触发器和控制标志列)。
  3. 具有多个文件组的分区表,并将您的某些文件组设置为只读。