无法以非超级用户身份在公共架构中创建表
postgres - 超级用户。
我做了什么:
ALTER SCHEMA public owner to postgres;
CREATE USER admin WITH PASSWORD 'my-password';
GRANT USAGE, CREATE ON SCHEMA public TO postgres;
GRANT USAGE, CREATE ON SCHEMA public TO admin;
CREATE DATABASE mydb;
GRANT ALL ON DATABASE mydb TO admin;
Run Code Online (Sandbox Code Playgroud)
特权:
postgres=# \dn+
List of schemas
Name | Owner | Access privileges | Description
--------+----------+----------------------+------------------------
public | postgres | postgres=UC/postgres+| standard public schema
| | =UC/postgres +|
| | admin=UC/postgres |
(1 row)
Run Code Online (Sandbox Code Playgroud)
我得到了什么:

如何在公共模式中创建表?
使用Postgres,我试图AUTO_INCREMENT在SQL中自动编号我的主键.但是,它给了我一个错误.
CREATE TABLE Staff (
ID INTEGER NOT NULL AUTO_INCREMENT,
Name VARCHAR(40) NOT NULL,
PRIMARY KEY (ID)
);
Run Code Online (Sandbox Code Playgroud)
错误:
Run Code Online (Sandbox Code Playgroud)********** Error ********** ERROR: syntax error at or near "AUTO_INCREMENT" SQL state: 42601 Character: 63
知道为什么吗?
如何为任意用户授予对所有函数和视图的读/选访问权限?
我psql --user=postgres -d mydb -f myview.sql用来创建几个函数和视图,然后我运行:
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
Run Code Online (Sandbox Code Playgroud)
获得所有权限后,我希望myuser现在可以访问postgres用户创建的功能和视图.但是,当我尝试访问它们时myuser,我得到了"关系允许拒绝..."错误.为什么是这样?
我正在从MySQL迁移到PostgreSQL并且已经打破了用户权限.我习惯使用以下命令为用户分配数据库的所有表的所有权限:
# MySQL
grant all privileges on mydatabase.* to 'myuser'@'localhost' identified by 'mypassword';
Run Code Online (Sandbox Code Playgroud)
在我看来,PostgreSQL 9.x解决方案涉及为"模式"分配权限,但我需要努力弄清楚究竟要发出什么SQL证明是过分的.我知道再花几个小时的研究会得出答案,但我认为每个从MySQL迁移到PostgreSQL的人都可以从网上至少有一个提供简单完整配方的页面中受益.这是我需要为用户发出的唯一命令.我宁愿不必为每个新表发出命令.
我不知道在PostgreSQL中必须以不同的方式处理哪些场景,所以我将列出我过去通常必须处理的一些场景.假设我们只想修改已创建的单个数据库的权限.
(1a)并非所有表都已创建,或(1b)表已经创建.
(2a)尚未创建用户,或(2b)已创建用户.
(3a)尚未将权限分配给用户,或者(3b)先前已将权限分配给用户.
(4a)用户只需要插入,更新,选择和删除行,或者(4b)用户还需要能够创建和删除表.
我已经看到了为所有数据库授予所有权限的答案,但这不是我想要的.拜托,我正在寻找一个简单的食谱,虽然我也不介意解释.
我不想授予所有用户和所有数据库的权限,因为这似乎是传统的快捷方式,因为当任何一个用户受到攻击时,该方法会破坏所有数据库.我托管多个数据库客户端并为每个客户端分配不同的登录.
看起来我还需要USAGE获得serial列的增加值的权限,但我必须以某种顺序授予它.我的问题变得更复杂了.
我们一直在尝试在其中一个数据库中创建许多角色和用户。有一次我遇到了这个问题,我发现很难重现。
它在数据库中是可重现的,但是当我创建一个新数据库并尝试相同的操作时,它不会发生:(
ALTER TABLE public.table_name OWNER TO role_name;
通常,在我们运行此查询之后。这table_name将由owned角色role_name/用户决定。
运行上述查询后,如果我们运行以下查询:
select grantee, table_catalog, privilege_type, table_schema, table_name
from information_schema.table_privileges
where table_name = 'table_name'
order by grantee, table_schema, table_name
Run Code Online (Sandbox Code Playgroud)
我们将得到以下结果:
role_name | database_name | INSERT | public | table_name
role_name | database_name | DELETE | public | table_name
role_name | database_name | SELECT | public | table_name
role_name | database_name | UPDATE | public | table_name
role_name | database_name | TRUNCATE | public | table_name
role_name …Run Code Online (Sandbox Code Playgroud)