2010-10-21 15 views
4

我有一个包含SQL语句的字符串。我想知道查询是修改数据还是数据库结构,还是只读取数据。有没有办法做到这一点?在Oracle中:如何判断SQL查询是否会导致更改而不执行?

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

截至目前我只测试字符串中的第一个字是“选择”,但这是太狭窄,太不安全。

回答

9

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

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

由于奥拉西奥表明,它也是一个不错的主意/实践添加“包装”的观点,只有要公开什么暴露。某种“公共API”。如果您需要更改基础表并且不想/不能将报告更改为所述表的新定义,这可以为您提供灵活性。然而,这可能被看作是很多“额外的工作”。

+0

为什么我必须为表格/视图创建同义词? “只读用户”应该能够查看整个数据库,这是否会有所作为? – 2010-10-21 12:12:33

+1

如果您不创建公共同义词,则只读用户必须始终使用schemaname.tablename,其中schemaname是表所属的模式。我认为你应该对Oracle有所了解。 – softveda 2010-10-21 12:22:02

10

对于应用程序使用的登录名,您应该只在您的表上授予选择特权。

+0

不可以。应用程序需要更改数据。 – 2010-10-21 11:38:57

+0

@Svein Bringsli:您可以使用不同的登录名运行用户提供的查询吗? (顺便说一下,你直接反驳你自己的问题,谨慎解释?“需要改变数据”vs“不应该被允许修改任何东西) – Piskvor 2010-10-21 11:41:50

+8

@Svein Bringsli - 是不是可以有一个单独的登录只是为了按照Pratik的建议,执行动态报告查询并仅使用SELECT权限登录?我认为这是唯一真正的万无一失的选择,并且为这个动态报告单独登录似乎是一种可接受的权衡,至少对我而言 – InSane 2010-10-21 11:42:20

3

我与其他人同意,做正确的事情是使用一个单独的模式有访问限制&权限应该只读那些查询。

另一种选择,但是,只读执行由用户(SET TRANSACTION READ ONLY)进入语句之前设置的事务。

2

创建视图,以公开数据为最终用户,这是值得的,因为三件事情:

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

的东西,在过去的工作很适合我,但可能不适合您的情况:

  • 存储使用为应用程序实现API的过程。所有修改都通过该API完成。暴露于前端的程序都是完整的工作单元,这些程序负责维权。
  • 运行前端应用程序的用户只能调用API存储过程并读取数据。
  • 由于公开的API做相对应的用户可以通过GUI采取措施,允许其运行的程序的工作完全直属单位没有得到他们的任何额外的能力,也让他们损坏数据库意外。
1

SELECT * FROM table FOR UPDATE即使只有SELECT特权也能工作,并且仍然会造成很大的损害。如果你想要安全,只读事务更好。

相关问题