0

私はPostgreSqlを初めて使用し、バージョン8.3を使用しています。テーブルに特定のトリガーがあるかどうかをチェックする関数を作成する必要があります。トリガーが存在する場合は、ドロップする必要があります。

以下のようにドロップクエリを生成しています:

var_DropTriggerSqlPart='ドロップトリガー"'||var_TriggersRecord。"triggerName"||'" on"'||var_Record。"SchemaName"||'"。"'||var_Record。"TableName"||'";';

-(ここで、すべての'var_'は必要なデータを持つ変数です)。

var_DropTriggerSqlPartを実行します。

しかし、トリガーがドロップされたのはわかりません。誰かが私がここで間違っていることを教えてもらえますか?

4

2 に答える 2

0

私は答えを見つけたと思います。「perform」を「execute」に変更し、関数を「stable」ではなく「volatile」にしました。

于 2012-09-02T18:37:56.430 に答える
0

ここにいくつかのポイントがあります。

まず、EXECUTEがこれを行う正しい方法であるというのは正しいことです。トリガーを作成する場合は、覚えておくべきことがいくつかあります(このようなことはたくさん行います)。

大きな問題は、このようなユーティリティステートメントにはクエリプランがないため、パラメータ化できないことです。もちろん、文字列を作成してSQLとして実行しています。これには、SQLインジェクションの可能性を含め、あらゆる場所で発生するすべての問題があります。関数がSECURITYDEFINERの場合、ストアドプロシージャにSQLインジェクションを介して特権を昇格させる可能性があります。

これは、quote_ident()とquote_literal()という2つの関数をよく理解することで解決されます。

上記の例では、次のように変更することをお勧めします。

var_DropTriggerSqlPart = 'drop trigger "' || 
     quote_ident(var_TriggersRecord."triggerName") || '" on "' || 
     quote_ident(var_Record."SchemaName") || '"."' || 
     quote_ident(var_Record."TableName") || '";';

LedgerSMBでは、UDFで多くのユーティリティステートメントを実行し、この問題に対処する必要があります。通常、レビュー/監査を容易にするために、これを行うほとんどの機能もまとめています。

于 2012-09-03T00:04:38.253 に答える