【发布时间】:2015-04-15 22:24:12
【问题描述】:
我只是想阻止用户在没有 WHERE 子句的情况下运行 UPDATE 语句。我在下面提供了我的 PLSQL
create or replace PROCEDURE secure_update(update_query IN varchar2)
IS
msg varchar2(30000);
flag char(1);
qry varchar2(30000);
BEGIN
IF upper(update_query) LIKE 'UPDATE%SET%WHERE%=%' THEN
flag := '1';
ELSE
flag := '0';
END IF;
IF (flag = '1') THEN
--qry := update_query;
execute immediate update_query into msg;
END IF;
dbms_output.put_line(msg);
END;
这就是我的执行方式
EXEC secure_update
('
UPDATE dummy_table
SET col1 = ''whatever''
WHERE pk = ''1234''
')
我不断收到这条消息:
无效的 SQL 类型:sqlKind = UNINITIALIZED
您能帮我找出解决此错误的方法吗?
【问题讨论】:
-
使用
dynamic sql时,尝试将varchar值放在两个引号''whatever''我的意思是使用''作为' -
除了您看到的错误、不平衡的单引号以及
exec必须在一行之外,我不确定您的目标。如果您想检查where子句以使调用者无法一次更新所有记录,那么是什么阻止他们执行where 1=1之类的操作? -
这个 plsql 用于实验目的。我目前不考虑安全性
-
不相关但是:为什么不使用真正的
boolean来表示flag变量? -
@AlexPoole:单行所需的 exec 是 SQL*Plus 的限制。并非所有 SQL 客户端都有相同的限制。