0

PostgreSQL で 1 つのテーブルを暗号化/復号化する大きなクエリがあります。このクエリに新しい条件を追加したところ、エラーがスローされました。元のクエリは、日付と内部結合の関連性に基づいてすべてのレコードを取得します (条件を満たす tblSessions からのすべてのレコード)。

更新されたクエリは、parent_session_idが null でない tblSessions からレコードのみを取得します (子レコードを持つ tblSessions からのレコードは結果から除外されます)。

tblsessions (only showing fields that pertain to join conditions)

sessionid | decision_id | start_time | end_time | is_comlete | parent_session_id
---------------------------------------------------------------------------------
SERIAL    | BYTEA       | BYTEA      | BYTEA    | BYTEA      | INTEGER DEFAULT 0

Posgres の SQL ウィンドウで、2 番目のクエリを実行すると、次のエラーが表示されます。

エラー: 関数 decrypt(integer, "unknown", "unknown") は存在しません SQL 状態: 42883 ヒント: 指定された名前と引数の型に一致する関数はありません。明示的な型キャストを追加する必要がある場合があります。

元のクエリ (作品):

SELECT z.conditionname, x.name AS domainname, d.decisionName,
                            c.firstname AS counselor_first_name, c.lastname AS counselor_last_name,
                            o.name AS organization_name,
                            encode(decrypt(s.start_time, '####salt####', '###encryption mode###'), 'escape') AS start_time,
                            encode(decrypt(s.end_time, '####salt####', '###encryption mode###'), 'escape') AS end_time,
                            encode(decrypt(s.is_complete, '####salt####', '###encryption mode###'), 'escape') AS is_complete,
                            s.parent_session_id


                    FROM tblDecisions d
                        INNER JOIN tblSessions s ON encode(decrypt(s.decision_id, '####salt####', '###encryption mode###'), 'escape') = d.decisionid
                        INNER JOIN tblCounselors c ON encode(decrypt(s.counselor_ck, '####salt####', '###encryption mode###'), 'escape') = c.campuskey
                        INNER JOIN tblCounselor_to_organization co ON co.counselor_id = c.counselorid
                        INNER JOIN tblOrganizations o ON o.organizationid = co.organization_id
                        INNER JOIN tblDomains x ON x.domainid = d.domain_id

                        INNER JOIN tblConditions z ON z.conditionid = x.condition_id
                    AND encode(decrypt(s.start_time, '####salt####', '###encryption mode###'), 'escape') >= '2012-01-01 00:00:00'

                    AND encode(decrypt(s.is_complete, '####salt####', '###encryption mode###'), 'escape') = 'true'



                    ORDER BY encode(decrypt(s.start_time, '####salt####', '###encryption mode###'), 'escape'), encode(decrypt(s.last_name, '####salt####', '###encryption mode###'), 'escape'), encode(decrypt(s.first_name, '####salt####', '###encryption mode###'), 'escape') 

改訂されたクエリ (機能しません。以下にコメントを追加)

    SELECT z.conditionname, x.name AS domainname, d.decisionName,
                                c.firstname AS counselor_first_name, c.lastname AS counselor_last_name,
                                o.name AS organization_name,
                                encode(decrypt(s.start_time, '####salt####', '###encryption mode###'), 'escape') AS start_time,
                                encode(decrypt(s.end_time, '####salt####', '###encryption mode###'), 'escape') AS end_time,
                                encode(decrypt(s.is_complete, '####salt####', '###encryption mode###'), 'escape') AS is_complete,
                                s.parent_session_id

//////// ADDITION START

                                , (SELECT MAX(encode(decrypt(start_time, '####salt####', '###encryption mode###'), 'escape')) AS start_time
                                FROM tblSessions s2
                                    WHERE encode(decrypt(s2.parent_session_id, '####salt####', '###encryption mode###'), 'escape') = encode(decrypt(s.parent_session_id, '####salt####', '###encryption mode###'), 'escape') )

//////// ADDITION END

                        FROM tblDecisions d
                            INNER JOIN tblSessions s ON encode(decrypt(s.decision_id, '####salt####', '###encryption mode###'), 'escape') = d.decisionid
                            INNER JOIN tblCounselors c ON encode(decrypt(s.counselor_ck, '####salt####', '###encryption mode###'), 'escape') = c.campuskey
                            INNER JOIN tblCounselor_to_organization co ON co.counselor_id = c.counselorid
                            INNER JOIN tblOrganizations o ON o.organizationid = co.organization_id
                            INNER JOIN tblDomains x ON x.domainid = d.domain_id
                            INNER JOIN tblConditions z ON z.conditionid = x.condition_id
                        AND encode(decrypt(s.start_time, '####salt####', '###encryption mode###'), 'escape') >= '2012-01-01 00:00:00'

                        AND encode(decrypt(s.is_complete, '####salt####', '###encryption mode###'), 'escape') = 'true'

/////// ADDITION START

                        AND NOT EXISTS (

                          SELECT 1
                          FROM   tblSessions s1
                          WHERE  encode(decrypt(s1.parent_session_id, '####salt####', '###encryption mode###'), 'escape') = encode(decrypt(s.sessionid, '####salt####', '###encryption mode###'), 'escape') )
                        AND (
                                ( encode(decrypt(s.parent_session_id, '####salt####', '###encryption mode###'), 'escape') IS NULL) OR
                                ( encode(decrypt(s.start_time, '####salt####', '###encryption mode###'), 'escape') = (
                                    SELECT MAX(encode(decrypt(start_time, '####salt####', '###encryption mode###'), 'escape')) AS start_time
                                    FROM tblSessions s2
                                    WHERE encode(decrypt(s2.parent_session_id, '####salt####', '###encryption mode###'), 'escape') = encode(decrypt(s.parent_session_id, '####salt####', '###encryption mode###'), 'escape')
                                 )
                             )
                        )

///////// ADDITION END

                        ORDER BY encode(decrypt(s.start_time, '####salt####', '###encryption mode###'), 'escape'), encode(decrypt(s.last_name, '####salt####', '###encryption mode###'), 'escape'), encode(decrypt(s.first_name, '####salt####', '###encryption mode###'), 'escape')

エラー メッセージは理解できますが、クエリへのすべての追加が適切にデコードされているため、それが実際の問題であるとは言えません。明らかな何かが欠けていますか?

4

1 に答える 1

1

parent_session_id質問はそれがタイプであると述べていますが、フィールドのみを渡すように見える残りのコードとは異なり、以下のスニペットINTEGERの最初の引数として渡されます。decryptbytea

decrypt(s.parent_session_id, '####salt####', '###encryption mode###')

decryptこれは、最初の引数として整数を取るフレーバーがないため、前述のエラーを引き起こす可能性があります (エラー メッセージから、 \df decryptinで確認できますpsql) 。

これらのセッション ID は暗号化されていますか?

于 2013-01-21T20:36:00.490 に答える