次のPL/SQLがADOを介してリモートoracle 11gr2サーバーに送信されています。 ユーザーの有無を確認することが目的です。そうであれば、すべての接続を殺す。最後にユーザーを削除します。Oracle PL/SQL文がエラーをスローする
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;
私はずっと微調整後に受信したエラーメッセージはまだです:
ERROR:[Microsoft][ODBC driver for Oracle][Oracle]ORA-06550: line 1, column 286: PLS-00103: Encountered the symbol "DROP" when expecting one of the following:
(begin case declare else elsif end exit for goto if loop mod
null pragma raise return select update while with << continue close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe purge
それはIF文の内側に落下したの構文が好きではありません。誰かがこれを正しく実行するように知っていますか?
編集: 明らかに、私はこのようにこの文を実行しません。しかし、環境のために、これは唯一可能な方法であり、セキュリティ上のリスクは生じません。私はほぼすべての良い習慣に違反していることを知っていますが、今度は必要です!
...それがお役に立てば幸いです。これにより、次のようなことが実現します。1)ジェットパーサーを問題から削除し、Oracleで内部的に処理させます。 2)SPを構造化して、成功または失敗として1または0を返すだけで、注入の試行を拒否することができます。さらに、* Ollie *のアドバイスに注意して、バインドパラメータを使用してSQLトランザクションをさらに保護します。 – FlyingGuy
@wave:また、 'count(1)'を 'count(*) 'に使う利点はありません。さらに、SQL解析エンジンは、とにかく 'count(1)'を 'count(*) 'に変更します。 Tom Kyteの多くの記事を参照してください。[Select Count(1):動作の仕方](http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1156151916789 ) – Wolf