Skip to main content

什么是表的所有者 (Owner)

在 PostgreSQL 中,每个数据库对象都有一个所有者。所有者是创建对象的用户,拥有对该对象的完全控制权。拥有对象的所有者权限可以对表进行操作,包括更改表的结构、插入、更新和删除数据等。

很坑的是其它用户,如果不是Owner,是不能修改表结构的,哪怕你给它所有权限也不行,除非你是管理员。如果你一开始用postgre用户创建了表,然后想给某个数据库单独设置一个用户,你就会很悲催的发现,这个新的用户改不了表结构!

查看表的当前所有者

在修改表的所有者之前,我们可以先查看表的当前所有者。通过执行以下 SQL 查询语句,我们可以获取表的所有者信息:

SELECT
schemaname,
tablename,
tableowner
FROM
pg_tables
WHERE
schemaname NOT IN ('pg_catalog', 'information_schema');

上述查询语句将返回所有公共模式(public schema)下的表的名称和对应的所有者。如果你的表是在其它schema下,注意修改 SQL

修改表的所有者

要修改表的所有者,我们可以使用 ALTER TABLE 语句,并指定新的所有者。以下是修改单个表所有者的示例:

ALTER TABLE table_name OWNER TO new_owner;

需要将 table_name 替换为要修改的表的名称,将 new_owner 替换为新的所有者用户。

然而,如果有大量的表需要修改所有者,手动逐个操作是非常繁琐的。为了方便起见,我们可以编写一个脚本来修改所有的表的所有者。

DO
$$
DECLARE
r RECORD;
BEGIN
FOR r IN (
SELECT tablename
FROM pg_tables
WHERE schemaname = 'public' AND tableowner = 'old_owner'
)
LOOP
EXECUTE 'ALTER TABLE public.' || quote_ident(r.tablename) || ' OWNER TO new_owner;';
END LOOP;
END
$$;

修改一下 上面的脚本,把 old_owner 和 new_owner 改成你需要的用户名就可以了。修改后 可以用前面的查询语句再确认一下看看是不是已经修改成功了。我第一次使用时就忘记改old_owner了,结果啥也没改变。

总结

通过使用 ALTER TABLE 语句,我们可以修改 PostgreSQL 数据库中所有表的所有者。可以手动逐个操作表的所有者,如果表比较多还是用批量脚本省事一些。这对于需要将表的控制权转移给其他用户的场景非常有用。在实际操作中,请谨慎处理表的所有者,确保只有授权的用户具有操作权限。