我有一个包含SQL语句的字符串。我想知道查询是修改数据还是数据库结构,还是只读取数据。有没有办法做到这一点?在Oracle中:如何判断SQL查询是否会导致更改而不执行?
更多信息:在我们的应用程序,我们需要让用户输入SQL查询,主要是由于报告应用系统的一部分。应该允许这些SQL查询从数据库中读取他们喜欢的任何内容,但不应允许它们修改任何内容。没有更新,删除插入,表中删除,清除约束等
截至目前我只测试字符串中的第一个字是“选择”,但这是太狭窄,太不安全。
我有一个包含SQL语句的字符串。我想知道查询是修改数据还是数据库结构,还是只读取数据。有没有办法做到这一点?在Oracle中:如何判断SQL查询是否会导致更改而不执行?
更多信息:在我们的应用程序,我们需要让用户输入SQL查询,主要是由于报告应用系统的一部分。应该允许这些SQL查询从数据库中读取他们喜欢的任何内容,但不应允许它们修改任何内容。没有更新,删除插入,表中删除,清除约束等
截至目前我只测试字符串中的第一个字是“选择”,但这是太狭窄,太不安全。
为仅具有选择特权的应用程序部分创建新用户。请记住,您还需要为“只读”用户能够查看的所有表/视图创建同义词。
您的应用程序的“常规”部分仍然可以执行其他操作(插入,更新,删除)。只有报告将使用只读用户。
由于奥拉西奥表明,它也是一个不错的主意/实践添加“包装”的观点,只有要公开什么暴露。某种“公共API”。如果您需要更改基础表并且不想/不能将报告更改为所述表的新定义,这可以为您提供灵活性。然而,这可能被看作是很多“额外的工作”。
对于应用程序使用的登录名,您应该只在您的表上授予选择特权。
不可以。应用程序需要更改数据。 – 2010-10-21 11:38:57
@Svein Bringsli:您可以使用不同的登录名运行用户提供的查询吗? (顺便说一下,你直接反驳你自己的问题,谨慎解释?“需要改变数据”vs“不应该被允许修改任何东西) – Piskvor 2010-10-21 11:41:50
@Svein Bringsli - 是不是可以有一个单独的登录只是为了按照Pratik的建议,执行动态报告查询并仅使用SELECT权限登录?我认为这是唯一真正的万无一失的选择,并且为这个动态报告单独登录似乎是一种可接受的权衡,至少对我而言 – InSane 2010-10-21 11:42:20
我与其他人同意,做正确的事情是使用一个单独的模式有访问限制&权限应该只读那些查询。
另一种选择,但是,只读执行由用户(SET TRANSACTION READ ONLY
)进入语句之前设置的事务。
创建视图,以公开数据为最终用户,这是值得的,因为三件事情:
CREATE VIEW items (name, price, tax) AS SELECT name, price, tax_rate FROM item WITH READ ONLY;
的东西,在过去的工作很适合我,但可能不适合您的情况:
SELECT * FROM table FOR UPDATE即使只有SELECT特权也能工作,并且仍然会造成很大的损害。如果你想要安全,只读事务更好。
为什么我必须为表格/视图创建同义词? “只读用户”应该能够查看整个数据库,这是否会有所作为? – 2010-10-21 12:12:33
如果您不创建公共同义词,则只读用户必须始终使用schemaname.tablename,其中schemaname是表所属的模式。我认为你应该对Oracle有所了解。 – softveda 2010-10-21 12:22:02