PG中的bug

根据SQL标准,一个模式的所有者总是拥有其中的所有对象。PostgreSQL允许模式包含由模式所有者以外的用户拥有的对象。

这种情况才会发生在,当模式拥有者将模式的"CREATE"权限授予其他人,或者超级用户选择在模式中创建对象。

所以,就存在这么一种情况,一个对象属于两个owner,schema的owner可以直接drop其他用户创建的对象。

同样这种情况在database中也出现。


模式owner删除非所属对象

创建一个库和两个用户
postgres=# create database tesedb;
CREATE DATABASE
postgres=# \conninfo
You are connected to database "postgres" as user "postgres" via socket in "/tmp" at port "5432".
postgres=# create user uu1;
CREATE ROLE
postgres=# create user uu2;
CREATE ROLE

赋予uu1 create的权限
testdb=> \c testdb postgres;
You are now connected to database "testdb" as user "postgres".
testdb=# grant create on database testdb to uu1;
GRANT


uu1创建schema
testdb=# \c testdb uu1;
You are now connected to database "testdb" as user "uu1".
testdb=> create schema uu1schema;
CREATE SCHEMA
testdb=> \dn+
List of schemas
Name | Owner | Access privileges | Description
-----------+----------+----------------------+------------------------
public | postgres | postgres=UC/postgres+| standard public schema
| | =UC/postgres |
uu1schema | uu1 | |



赋予uu2 create权限
postgres=# \c testdb
You are now connected to database "testdb" as user "postgres".
testdb=# grant create on schema uu1schema to uu2;
GRANT

uu在uu1的schema下去建表
postgres=# \c testdb uu2;
testdb=> create table uu1schema.t1(id int);
CREATE TABLE


发现uu1可以删除uu2创建的表
testdb=> drop table uu1schema.t1;
DROP TABLE

更能直接删除
testdb=> drop schema uu1schema cascade;
NOTICE: drop cascades to table uu1schema.t1
DROP SCHEMA

可以看到,uu1schema的owner uu1删除掉了uu2创建的表对象。

库owner删除非所属对象

赋予uu1创建database的权限
alter user uu1 createdb;

uu1创建库
testdb=> create database db1;
CREATE DATABASE


uu2连接上db1
\c db1 uu2
create table t1(id int);

切换到uu1
db1=> \c db1 uu1;
You are now connected to database "db1" as user "uu1".
db1=> drop table t1; 无法删除表
ERROR: must be owner of table t1

但是却能直接删库
testdb=> drop database db1;
DROP DATABASE