如何在Java for Oracle数据库中创建只读连接

时间:2014-09-12 05:32:13

标签: java sql oracle

我必须设计一个工具,其中包含用户可以输入查询的文本区域,并显示提交结果。我的要求是这样一种方式,它应该只接受选择查询,但不接受更新,插入,删除。如果是选择结果应该显示,否则应该抛出错误。我已经尝试过如下方式将数据库连接设为只读。

Connection.setReadOnly(true),这是不值得推荐的,它会引发错误。

' setReadOnly' WebSphere java.sql.Connection实现不支持。

有人可以帮我获取数据库的只读连接,或者是否需要更改设计

4 个答案:

答案 0 :(得分:6)

一个常见的概念是仅向DB-User提供所需的授权。 在您的情况下,应用程序可以使用特定于应用程序的用户在允许的表/视图上使用select-grants。

澄清一些误解:我在谈论你的JDBC-Connection使用的用户。

答案 1 :(得分:4)

您可以通过以下方式创建只读用户:

SQL> create user read_only identified by read_only;

User created.

SQL> grant create session, select any table, select any dictionary to read_only;

Grant succeeded.

SQL> conn read_only@pdborcl/read_only;
Connected.
SQL> create table t(col number);
create table t(col number)
*
ERROR at line 1:
ORA-01031: insufficient privileges


SQL> desc scott.emp;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(4)
 ENAME                                              VARCHAR2(10)
 JOB                                                VARCHAR2(9)
 MGR                                                NUMBER(4)
 HIREDATE                                           DATE
 SAL                                                NUMBER(7,2)
 COMM                                               NUMBER(7,2)
 DEPTNO                                             NUMBER(2)

SQL> select count(*) from scott.emp;

  COUNT(*)
----------
        14

SQL> update scott.emp set ename='LALIT';
update scott.emp set ename='LALIT'
             *
ERROR at line 1:
ORA-01031: insufficient privileges


SQL> insert into scott.emp(ename) values('LALIT');
insert into scott.emp(ename) values('LALIT')
                  *
ERROR at line 1:
ORA-01031: insufficient privileges


SQL>

答案 2 :(得分:0)

嗯,这是星期五,我希望你不会生我的气......

http://xkcd.com/327/利用妈妈

enter image description here

...清理您的数据库输入......

答案 3 :(得分:-1)

如果你绝对必须让用户输入查询而不是给他们一个gui查询构建器,你可以获得查询字符串,在通过实体管理器实际执行它之前,你可以对关键字进行简单的检查,如

if (QueryString.toLowerCase().contains("update"))// to be case insensitive
{//handle as you wish}
else if (QueryString.toLowerCase().contains("delete"))// to be case insensitive
{//handle as you wish} // Keep doing that as many times as you with till finally
else
{// Execute your query}

如果真的卡住了,那就是一个非常快速和肮脏的解决方案