PostgreSQL 中有没有办法为会话中的所有未来创建表语句设置默认所有者

Wol*_*mec 5 oracle ddl

我们有一个将 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)

在每个创建表命令之后。

Pau*_*ulo 6

请注意:我对 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 解决方案不同。