psql PGP_SYM_DECRYPT : 提示:没有函数匹配给定的名称和参数类型
psql PGP_SYM_DECRYPT : HINT: No function matches the given name and argument types
从今天早上开始:
psql PGP_SYM_DECRYPT : HINT: No function matches the given name and argument types.
LINE 1: select login,PGP_SYM_DECRYPT(password,'*******') from pa...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
存在扩展 pg_crypto。
所以我无法 select 之前 pgp_sym_encrypt 查询的任何数据...
出了什么问题?如何解决?
如果扩展没有更新并且它在昨天运行,则问题可能与 search_path
有关。确保在 search_path.
中设置了扩展的路径
因此,要检查扩展的安装位置,请键入 \dx
并记下架构。然后,键入 show search_path;
并确保扩展程序的架构列在那里(可能是 public
)。如果没有,请将扩展程序的架构添加到搜索路径。
为了进行调查,我构建了一个包含较少列的 table 的副本。
并尝试了相同的密码视觉检查:
perso=# select quoi,login,pgp_sym_decrypt(password::bytea,'someKEY') from tempo where quoi ilike '%somesite%' ;
quoi | login | pgp_sym_decrypt
--------------+-----------------------+-----------------
somesite.com | somename@somewhere.fr | foobar
(1 row)
perso=# select quoi,login,pgp_sym_decrypt(password,'someKEY') from tempo where quoi ilike '%somesite%' ;
quoi | login | pgp_sym_decrypt
--------------+-----------------------+-----------------
somesite.com | somename@somewhere.fr | foobar
(1 row)
perso=# \d+ tempo
Table "public.tempo"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
----------+---------+-----------+----------+---------+----------+--------------+-------------
ref | integer | | | | plain | |
quoi | text | | | | extended | |
login | text | | | | extended | |
password | bytea | | | | extended | |
这里没有更多问题,所以 table 或数据 store-mode 上有问题。
perso=# \d+ passwd
Table "public.passwd"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
----------+---------+-----------+----------+-------------------------------------+----------+--------------+-------------
ref | integer | | not null | nextval('passwd_ref_seq'::regclass) | plain | |
quoi | text | | not null | | extended | |
login | text | | not null | | extended | |
password | text | | not null | | extended | |
Indexes:
"passwd_pkey" PRIMARY KEY, btree (ref)
"passwd_password_key" UNIQUE CONSTRAINT, btree (password)
perso=#
perso=# select quoi,login,pgp_sym_decrypt(password,'someKEY') from passwd where quoi ilike '%somesite%' ;
ERROR: function pgp_sym_decrypt(text, unknown) does not exist
LINE 1: select quoi,login,pgp_sym_decrypt(password,'someKEY') fr...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
perso=#
这里我们有返回错误并在密码列上检测到 text
。
所以测试:
- alter table => 大失败,它第二次重新编码所有数据..
- 跌落测试table密码
- 恢复测试table密码
- 按节奏复制 table 数据
- 删除密码中的数据table
- 修改密码table
- 将数据复制回密码 table
作为我的测试程序。
所以我做到了:
perso=#
perso=# delete from passwd ;
DELETE 106
perso=# alter table passwd alter column password type bytea using PGP_SYM_ENCRYPT(password::text,'someKEY');
ALTER TABLE
perso=# \d+ passwd
Table "public.passwd"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
----------+---------+-----------+----------+-------------------------------------+----------+--------------+-------------
ref | integer | | not null | nextval('passwd_ref_seq'::regclass) | plain | |
quoi | text | | not null | | extended | |
login | text | | not null | | extended | |
password | bytea | | not null | | extended | |
Indexes:
"passwd_pkey" PRIMARY KEY, btree (ref)
"passwd_password_key" UNIQUE CONSTRAINT, btree (password)
perso=# insert into passwd (ref,quoi,login,password) select ref,quoi,login,password::bytea from tempo ;
INSERT 0 106
perso=#
perso=#
perso=# select quoi,login,pgp_sym_decrypt(password,'someKEY') from passwd where quoi ilike '%somesite%' ;
quoi | login | pgp_sym_decrypt
--------------+-----------------------+-----------------
somesite.com | somename@somewhere.fr | foobar
(1 row)
perso=#
然后我备份数据库;并应用类似的程序来成功解决问题。这可能是更好的方法,但这样我就理解了这个过程。
两个解决方案都在里面:
- 使用具有 column:bytea 语法的查询
- 将列类型固定为be:bytea
从今天早上开始:
psql PGP_SYM_DECRYPT : HINT: No function matches the given name and argument types.
LINE 1: select login,PGP_SYM_DECRYPT(password,'*******') from pa...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
存在扩展 pg_crypto。
所以我无法 select 之前 pgp_sym_encrypt 查询的任何数据... 出了什么问题?如何解决?
如果扩展没有更新并且它在昨天运行,则问题可能与 search_path
有关。确保在 search_path.
因此,要检查扩展的安装位置,请键入 \dx
并记下架构。然后,键入 show search_path;
并确保扩展程序的架构列在那里(可能是 public
)。如果没有,请将扩展程序的架构添加到搜索路径。
为了进行调查,我构建了一个包含较少列的 table 的副本。 并尝试了相同的密码视觉检查:
perso=# select quoi,login,pgp_sym_decrypt(password::bytea,'someKEY') from tempo where quoi ilike '%somesite%' ;
quoi | login | pgp_sym_decrypt
--------------+-----------------------+-----------------
somesite.com | somename@somewhere.fr | foobar
(1 row)
perso=# select quoi,login,pgp_sym_decrypt(password,'someKEY') from tempo where quoi ilike '%somesite%' ;
quoi | login | pgp_sym_decrypt
--------------+-----------------------+-----------------
somesite.com | somename@somewhere.fr | foobar
(1 row)
perso=# \d+ tempo
Table "public.tempo"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
----------+---------+-----------+----------+---------+----------+--------------+-------------
ref | integer | | | | plain | |
quoi | text | | | | extended | |
login | text | | | | extended | |
password | bytea | | | | extended | |
这里没有更多问题,所以 table 或数据 store-mode 上有问题。
perso=# \d+ passwd
Table "public.passwd"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
----------+---------+-----------+----------+-------------------------------------+----------+--------------+-------------
ref | integer | | not null | nextval('passwd_ref_seq'::regclass) | plain | |
quoi | text | | not null | | extended | |
login | text | | not null | | extended | |
password | text | | not null | | extended | |
Indexes:
"passwd_pkey" PRIMARY KEY, btree (ref)
"passwd_password_key" UNIQUE CONSTRAINT, btree (password)
perso=#
perso=# select quoi,login,pgp_sym_decrypt(password,'someKEY') from passwd where quoi ilike '%somesite%' ;
ERROR: function pgp_sym_decrypt(text, unknown) does not exist
LINE 1: select quoi,login,pgp_sym_decrypt(password,'someKEY') fr...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
perso=#
这里我们有返回错误并在密码列上检测到 text
。
所以测试:
- alter table => 大失败,它第二次重新编码所有数据..
- 跌落测试table密码
- 恢复测试table密码
- 按节奏复制 table 数据
- 删除密码中的数据table
- 修改密码table
- 将数据复制回密码 table
作为我的测试程序。
所以我做到了:
perso=#
perso=# delete from passwd ;
DELETE 106
perso=# alter table passwd alter column password type bytea using PGP_SYM_ENCRYPT(password::text,'someKEY');
ALTER TABLE
perso=# \d+ passwd
Table "public.passwd"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
----------+---------+-----------+----------+-------------------------------------+----------+--------------+-------------
ref | integer | | not null | nextval('passwd_ref_seq'::regclass) | plain | |
quoi | text | | not null | | extended | |
login | text | | not null | | extended | |
password | bytea | | not null | | extended | |
Indexes:
"passwd_pkey" PRIMARY KEY, btree (ref)
"passwd_password_key" UNIQUE CONSTRAINT, btree (password)
perso=# insert into passwd (ref,quoi,login,password) select ref,quoi,login,password::bytea from tempo ;
INSERT 0 106
perso=#
perso=#
perso=# select quoi,login,pgp_sym_decrypt(password,'someKEY') from passwd where quoi ilike '%somesite%' ;
quoi | login | pgp_sym_decrypt
--------------+-----------------------+-----------------
somesite.com | somename@somewhere.fr | foobar
(1 row)
perso=#
然后我备份数据库;并应用类似的程序来成功解决问题。这可能是更好的方法,但这样我就理解了这个过程。
两个解决方案都在里面:
- 使用具有 column:bytea 语法的查询
- 将列类型固定为be:bytea