我们有一个将 cobol 数据(索引文件)传输到数据库的程序。
到目前为止,我们将数据传输到了一个 oracle 数据库。
在程序开始时,我使用用户登录sys
,然后将当前模式更改为ink
. 我是这样做的,因为ink
没有创建表的权限。
然后我创建了一个表,表所有者是自动的ink
,而不是sys
。
我们最近将数据库从 Oracle 切换到 Postgres。
在这里,我以“postgres”身份登录,然后使用以下命令切换到“ink”模式:
set search_path to 'ink';
Run Code Online (Sandbox Code Playgroud)
然后我创建一个表,表所有者自动是postgres
,不是ink
。所以这种行为是相反的。
我该怎么做才能获得与 oracle 数据库相同的行为:
在我的场景中,表所有者应该自动是ink
,而不是postgres
。
要是不用写就好了
ALTER TABLE ... OWNER TO ink;
Run Code Online (Sandbox Code Playgroud)
在每个创建表命令之后。
请注意:我对 PostgreSQL 比较陌生,所以我不确定这是否是一个好的做法,但是......
我认为可以解决这个问题的一种方法是在REASSIGN OWNED
创建数据库中所有对象的进程结束时执行一条语句,如下所示:
REASSIGN OWNED BY CURRENT_USER TO ink;
Run Code Online (Sandbox Code Playgroud)
这样,即使表暂时由用户拥有,一旦创建过程结束,postgres
您也会看到它们由用户拥有。ink
小智 3
在 Oracle 中,模式和用户是同一件事。在 Postgres 中则不然。
因此,在“Postgres land”中没有直接“映射”您在 Oracle 中所做的事情。表始终由最初创建它的用户拥有,无法更改。
如果您不想授予用户ink
创建表的权限,“Postgres”方式将授予该用户对表的所有权限。与 Oracle 不同,您可以为模式中创建的对象建立默认权限。您无需记住在创建每个表后授予它们。
create schema ink;
grant usage on schema ink to ink;
alter default privileges
in schema ink
grant all privileges on tables to ink;
Run Code Online (Sandbox Code Playgroud)
此后创建的每个表将自动具有定义的权限,即:ink
可以对它们执行任何操作,除了删除它们,因为该用户不是所有者。这与 Oracle 解决方案不同。