在Oracle中:如何判断SQL查询是否会在不执行更改的情况下进行更改?

时间:2010-10-21 11:33:18

标签: sql oracle sanitization

我有一个包含SQL语句的字符串。我想知道查询是否会修改数据或数据库结构,或者它是否只读取数据。有没有办法做到这一点?

更多信息:在我们的应用程序中,我们需要让用户输入SQL查询,主要是作为应用程序报告系统的一部分。应允许这些SQL查询从数据库中读取他们喜欢的任何内容,但不应允许他们修改任何内容。没有更新,删除插入,表格丢弃,约束删除等。

截至目前,我只测试字符串中的第一个单词是否为“select”,但这太紧凑且太不安全了。

6 个答案:

答案 0 :(得分:10)

对于应用程序使用的登录,您应该只授予表的select权限。

答案 1 :(得分:9)

为仅具有select权限的应用程序部分创建新用户。请记住,您还需要为“只读”用户能够查看的所有表/视图创建同义词。

您的应用程序的“常规”部分仍然可以执行其他操作(插入,更新,删除)。只是报告将使用只读用户。

正如Horacio所说,添加“包装”视图也是一个好主意/做法,这些视图只会暴露您想要公开的内容。某种“公共API”。如果您需要更改基础表并且不希望/不能将报告更改为所述表的新定义,这可以为您提供灵活性。然而,这可能被视为许多“额外工作”。

答案 2 :(得分:3)

我同意其他人的说法,正确的做法是使用一个具有有限访问权限的单独架构。那些应该是只读的查询的权限。

然而,另一个选择是在执行用户输入的语句(SET TRANSACTION READ ONLY)之前将事务设置为只读。

答案 3 :(得分:2)

创建VIEWS以向最终用户公开数据,这是值得的,因为有三件事:

  1. 最终用户不知道数据库的真实程度。
  2. 您可以提供一种更简单的方法来提取一些数据。
  3. 您可以使用只读约束创建视图:
  4.     CREATE VIEW items (name, price, tax)
              AS SELECT name, price, tax_rate
              FROM item
              WITH READ ONLY;
    

答案 4 :(得分:1)

过去对我有用的东西,但可能不适合你的情况:

  • 使用存储过程为应用程序实现API。所有修改都通过该API完成。暴露于前端的程序都是完整的工作单元,这些程序负责执行权限。
  • 运行前端应用程序的用户只能调用API存储过程并读取数据。
  • 由于公开的API确实完成了与用户可以通过GUI执行的操作相对应的工作单元,让他们直接运行程序不会获得任何额外的能力,也不会让他们意外地破坏数据库。

答案 5 :(得分:1)

SELECT * FROM表FOR UPDATE即使只有SELECT权限也能正常工作,并且仍会造成很大的破坏。如果您想要安全,只读事务会更好。