【发布时间】:2011-11-09 16:59:00
【问题描述】:
我通过 ADO 将以下 PL/SQL 发送到远程 oracle 11gr2 服务器。 它的目的是检查用户是否存在。然后,如果确实如此,则终止其所有连接。最后它丢弃了用户。
DECLARE
i INTEGER;
BEGIN
select count(1) into i from dba_users where username='<schema>';
if i=0 THEN
FOR c IN (SELECT s.sid,s.serial# FROM v$session s WHERE s.username = '<schema>') LOOP
EXECUTE IMMEDIATE 'alter system kill session ''' ||c.sid || ',' || c.serial# || '''';
END LOOP;
drop user <schema> Cascade;
END IF;
END;
经过多次调整后我收到的错误消息仍然是:
错误:[Microsoft][Oracle 的 ODBC 驱动程序][Oracle]ORA-06550:第 1 行, 第 286 列:PLS-00103:预期时遇到符号“DROP” 以下之一:
( begin case declare else elsif end exit for goto if loop mod
null pragma raise return select update while with
它不喜欢在 IF 语句中放置 drop 的语法。有谁知道让这个运行正常吗?
编辑: 需要明确的是,我通常不会以这种方式执行此语句。但由于环境原因,这是唯一可行的方法,不会造成任何安全风险。我知道我违反了几乎所有的良好做法,但这次是必要的!
【问题讨论】:
-
我强烈建议您在存储过程中执行此操作。这将完成几件事:1) 您将从问题中删除 jet 解析器并让 Oracle 在内部处理它。 2)您可以构造 SP,使其简单地返回 1 或 0 作为成功/失败,从而拒绝任何注入尝试。此外,请注意 Ollie 的建议并使用绑定参数来进一步保护任何 sql 事务。
-
@wave:另外,使用
count(1)比使用count(*)没有优势。此外,SQL 解析引擎无论如何都会将您的count(1)更改为count(*)。请参阅 Tom Kyte 的许多关于此的文章:Select Count(1): How it works