我有一个简单的存储过程,其返回值取决于inet_client_addr()
. inet_client_addr()
在测试我的存储过程时,如何为了单元测试的目的而覆盖?
到目前为止,我想出的唯一解决方案是围绕inet_client_addr()
以下内容创建一个包装函数:
CREATE FUNCTION my_inet_client_addr() RETURNS INET AS $$
SELECT inet_client_addr();
$$ LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)
然后在我的函数中使用它:
CREATE local_connection() RETURNS BOOLEAN AS $$
SELECT my_inet_client_addr() = '127.0.0.1';
$$ LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)
然后在我的单元测试中,我可以重新定义my_inet_client_addr()
:
BEGIN;
SELECT PLAN(2);
REPLACE FUNCTION my_inet_client_addr() RETURNS INET AS $$
SELECT '127.0.0.1'::INET;
$$ LANGUAGE sql;
is(local_connection(),TRUE,'Connection from 127.0.0.1 is local');
REPLACE FUNCTION my_inet_client_addr() RETURNS INET AS $$
SELECT '192.168.1.1'::INET;
$$ LANGUAGE sql;
is(local_connection(),FALSE,'Connection from 192.168.1.1. is not local');
ROLLBACK;
Run Code Online (Sandbox Code Playgroud)
有没有办法在没有包装功能的情况下完成相同的任务my_inet_client_addr()
?
我crypt()
在我的一个函数中使用了哈希用户密码。但是我在第二天启动我的电脑时观察到,同样的事情失败了,因为密码功能在重新启动时变得不可用。它显示消息,如功能gen_salt()
/crypt()
未知或未定义。我执行了create extension pgcrypto;
一次,它开始工作。
如何在生产环境中处理这个?即使 db 重新启动,有没有办法使该模块在 db 中永久可用?
或者我是否必须指示服务器管理器运行此命令以防他们需要重新启动数据库服务器?
或者我可以在函数本身中编写此语句,以便每次使用加密函数之前都会创建扩展?
此外,我们正在使用 db 的读取副本,它不允许执行此“创建扩展”语句,因为只有读取权限。那么如何在这样的只读环境中使用这种加密功能呢?
postgresql pgcrypto read-only-database postgresql-extensions
我正在创建一个 pre-prod Postgres 数据库,并希望确保访问用户具有有限的访问权限。
我想以这样的方式设置表的访问用户不能CREATE
,DROP
或ALTER
对象。目前,我可以看到将所有权更改为另一个用户的唯一方法,例如postgres
然后以某种方式仅授予所需的权限:
ALTER TABLE mytable SET OWNER TO postgres;
REVOKE connect ON DATABASE mydatabase FROM PUBLIC;
GRANT USAGE, SELECT, UPDATE ON ALL TABLES IN SCHEMA public TO dbuser;
GRANT connect ON DATABASE mydatabase TO dbuser;
Run Code Online (Sandbox Code Playgroud)
问题是当我执行上述操作SELECT
时,当我与应用了授权的用户连接时,我无法做一个简单的事情。例如:
select * from mytable;
Run Code Online (Sandbox Code Playgroud)
产量:
Run Code Online (Sandbox Code Playgroud)ERROR: permission denied for relation mytable
如何做到这一点?
此外,我应该使用public
?以外的命名模式吗?