sql >> データベース >  >> RDS >> Mysql

postgresqlのinsertステートメントでパスワードを暗号化するとエラーがスローされます(明示的な型キャストを追加する必要があります)

    これは実際の答えではなく、エラーの原因を見つける方法の簡単な説明です。

    まず、pgcryptoを見つけましょう 拡張子:

    select e.extname, n.nspname
    from pg_catalog.pg_extension e left join pg_catalog.pg_namespace n on n.oid = e.extnamespace;
    

    次のようなものが返されるはずです:

    ╔════════════════════╤════════════╗
    ║      extname       │  nspname   ║
    ╠════════════════════╪════════════╣
    ║ plpgsql            │ pg_catalog ║
    ║ adminpack          │ pg_catalog ║
    ║ plpythonu          │ pg_catalog ║
    ║ pg_stat_statements │ public     ║
    ║ plpython3u         │ pg_catalog ║
    ║ hstore             │ public     ║
    ║ uuid-ossp          │ public     ║
    ║ pg_trgm            │ public     ║
    ║ ltree              │ public     ║
    ║ tablefunc          │ public     ║
    ║ unaccent           │ public     ║
    ║ pgcrypto           │ nd         ║
    ╚════════════════════╧════════════╝
    

    したがって、pgcrypto スキーマndにインストールされています 私のデータベースにあります。

    次に、search_pathを見てみましょう。 DBオブジェクトを検索する場所に関する情報を提供するパラメーター:

    show search_path;
    ╔═════════════════╗
    ║   search_path   ║
    ╠═════════════════╣
    ║ "$user", public ║
    ╚═════════════════╝
    

    これは、オブジェクトが現在のユーザーの名前でスキーマ内で検索され、何も見つからない場合はスキーマpublic内で検索されることを意味します。 。

    最後に、現在のユーザーを確認しましょう:

    select current_user;
    ╔══════════════╗
    ║ current_user ║
    ╠══════════════╣
    ║ postgres     ║
    ╚══════════════╝
    

    ご覧のとおり、スキーマndにインストールされている拡張機能です。 search_pathを使用して見つけることができません これは実際にはpostgres, public エラーが発生しました:

    select gen_salt('md5');
    ERROR:  function gen_salt(unknown) does not exist
    LINE 1: select gen_salt('md5');
                   ^
    HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
    

    上記のDBの実際の値に応じて、修正する方法はいくつかあります。

    拡張機能を次のような別のスキーマに移動できます:

    alter extension pgcrypto set schema public;
    

    search_pathを変更できます 次のようなオプション:

    set search_path to '"$user", public'; -- for the active session only
    alter database your_db_name set search_path to '"$user", public'; -- permanently for the database
    

    最後に、SQLステートメントでスキーマを明示的に指定できます。

    select schema_where_it_installed.gen_salt('md5');
    -- For my example:
    select nd.gen_salt('md5');
    



    1. 日付形式とSQLクエリの説明

    2. 計算列がSQLServerで「永続化」されているかどうかを確認する方法

    3. 1つの列を複数の外部キーとして参照することは可能ですか?

    4. 動的SQLとストアドプロシージャ