我必须设计一个工具,其中包含用户可以输入查询的文本区域,并显示提交结果。我的要求是这样一种方式,它应该只接受选择查询,但不接受更新,插入,删除。如果是选择结果应该显示,否则应该抛出错误。我已经尝试过如下方式将数据库连接设为只读。
Connection.setReadOnly(true),这是不值得推荐的,它会引发错误。
' setReadOnly' WebSphere java.sql.Connection实现不支持。
有人可以帮我获取数据库的只读连接,或者是否需要更改设计
答案 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)
答案 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}
如果真的卡住了,那就是一个非常快速和肮脏的解决方案