Skip to content

用户相关

查看用户对某些对象的权限

sql
# 查看某个用户的系统权限:
SELECT * FROM pg_roles WHERE rolname='username';
# 查看某个用户对表的权限:
SELECT *
FROM information_schema.table_privileges
WHERE grantee='username';
# 查看某个用户对列的权限:
SELECT *
FROM information_schema.column_privileges
WHERE grantee='username';

创建用户

sql
create user 用户名 password '密码';

删除用户

sql
drop user 用户名;

给用户设置密码

sql
ALTER USER username PASSWORD 'new_password';
# 其中,`username` 是要更改密码的用户名,`new_password` 是新密码。

# 例如,要为用户 `myuser` 设置密码为 `mypassword`,可以执行以下命令:
ALTER USER myuser PASSWORD 'mypassword';

请确保将实际的用户名和密码替换为你要设置的值。

权限操作

这些授权操作的时候,并没有指定数数据库的选项,经过实测,在那个数据库下执行命令,就是指定那个数据库下的表或者schema,所以想要授予那个数据库的权限,需要先切换到相应的数据库,但是,revoke操作不需要切换,

赋予权限

对于数据库的权限操作

sql
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]
 
create:对于数据库,允许在数据库中创建新的schema、tableindex
connect:允许用户连接到指定的数据库。在连接启动时检查此权限。
temporary,temp:允许在使用指定数据库时创建临时表。
all privileges:一次授予所有可用权限。
public:所有用户。
  • CREATE: 允许在指定的数据库中创建新的对象,如表、视图、函数等。
  • CONNECT: 允许连接到指定的数据库。
  • TEMPORARYTEMP: 允许在指定的数据库中创建临时对象。
  • ALL [ PRIVILEGES ]: 授予所有权限,包括 CREATECONNECTTEMPORARY 等。
  • database_name: 要授予权限的数据库名称。
  • role_specification: 指定要授予权限的角色(用户或组)。
  • WITH GRANT OPTION: 允许被授权的角色将授予的权限再授予给其他角色。
  • GRANTED BY role_specification: 指定授权的角色。只有指定的授权角色才能使用 GRANT 命令撤销授权。

示例用法:

  1. 授予一个角色对数据库的连接权限:

    sql
    GRANT CONNECT ON DATABASE mydb TO myrole;
  2. 授予一个角色对数据库的创建表和连接权限,并允许该角色将授权再授予其他角色:

    sql
    GRANT CREATE, CONNECT ON DATABASE mydb TO myrole WITH GRANT OPTION;
  3. 授予多个角色对多个数据库的所有权限:

    sql
    GRANT ALL PRIVILEGES ON DATABASE db1, db2 TO role1, role2;
  4. 撤销角色对数据库的特定权限:

    sql
    REVOKE CREATE ON DATABASE mydb FROM myrole;

对于schema中表的权限操作

以下是对schema的操作权限设置的语法

sql
GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]
  • CREATE: 允许在指定的模式中创建新的对象,例如表、视图、函数等。
  • USAGE: 允许在指定的模式中使用对象,但不包括创建对象的权限。
  • ALL [ PRIVILEGES ]: 授予所有权限,包括 CREATEUSAGE
  • schema_name: 要授予权限的模式名称。
  • role_specification: 指定要授予权限的角色(用户或组)。
  • WITH GRANT OPTION: 允许被授权的角色将授予的权限再授予给其他角色。
  • GRANTED BY role_specification: 指定授权的角色。只有指定的授权角色才能使用 GRANT 命令撤销授权。

以下是几个用法示例:

  1. 授予一个角色在特定模式中创建对象的权限:

    sql
    GRANT CREATE ON SCHEMA schema_name TO role_name;
  2. 授予一个角色在特定模式中使用对象的权限,并允许该角色将授权再授予其他角色:

    sql
    GRANT USAGE ON SCHEMA schema_name TO role_name WITH GRANT OPTION;
  3. 授予多个角色在多个模式中的所有权限:

    sql
    GRANT ALL PRIVILEGES ON SCHEMA schema1, schema2 TO role1, role2;
  4. 撤销一个角色在特定模式中的特定权限:

    sql
    REVOKE CREATE ON SCHEMA schema_name FROM role_name;

对于表的权限操作

GRANT 命令用于授予表级别的权限。下面是 GRANT 命令的语法和参数解释:

sql
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]
  • SELECT: 允许查询表中的数据。
  • INSERT: 允许向表中插入新的行。
  • UPDATE: 允许更新表中的行。
  • DELETE: 允许删除表中的行。
  • TRUNCATE: 允许截断(清空)表。
  • REFERENCES: 允许在其他表中引用该表作为外键。
  • TRIGGER: 允许在表上创建触发器。
  • ALL [ PRIVILEGES ]: 授予所有权限,包括 SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGER

以下是两种常见的用法示例:

  1. 授予一个角色对特定表的查询和插入权限:

    sql
    GRANT SELECT, INSERT ON table_name TO role_name;
  2. 授予一个角色对特定模式中所有表的所有权限,并允许该角色将授权再授予其他角色:

    sql
    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA schema_name TO role_name WITH GRANT OPTION;

如果你希望授予或撤销多个权限,可以在 GRANTREVOKE 语句中列出多个权限,以逗号分隔。类似地,你可以指定多个表名或模式名,通过逗号分隔。

sql
#设置只读权限
alter user 用户名 set default_transaction_read_only = on;

#设置可操作的数据库
grant all on database 数据库名 to 用户名;

#设置可操作的模式和权限
grant [select,insert,update,delete] on [all tables] in schema [public] to 用户名;

对列级别的权限操作

GRANT 命令还可以用于授予表级别的列权限。以下是 GRANT 命令的语法和参数解释:

sql
GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
    [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
    ON [ TABLE ] table_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]
    [ GRANTED BY role_specification ]
  • SELECT: 允许查询表中特定列的数据。
  • INSERT: 允许向表中特定列插入新的值。
  • UPDATE: 允许更新表中特定列的值。
  • REFERENCES: 允许将表中特定列作为外键引用。
  • ALL [ PRIVILEGES ]: 授予所有权限,包括 SELECTINSERTUPDATEREFERENCES
  • column_name: 要授予权限的列名。
  • table_name: 要授予权限的表名。
  • role_specification: 指定要授予权限的角色(用户或组)。
  • WITH GRANT OPTION: 允许被授权的角色将授予的权限再授予给其他角色。
  • GRANTED BY role_specification: 指定授权的角色。只有指定的授权角色才能使用 GRANT 命令撤销授权。

以下是几个用法示例:

  1. 授予一个角色对表中特定列的查询权限:

    sql
    GRANT SELECT (column_name) ON table_name TO role_name;
  2. 授予一个角色对表中特定列的查询和插入权限,并允许该角色将授权再授予其他角色:

    sql
    GRANT SELECT (column_name), INSERT (column_name) ON table_name TO role_name WITH GRANT OPTION;
  3. 授予多个角色对多个表中特定列的更新和引用权限:

    sql
    GRANT UPDATE (column_name), REFERENCES (column_name) ON table1, table2 TO role1, role2;
  4. 授予一个角色对表中所有列的所有权限:

    sql
    GRANT ALL PRIVILEGES (column_name) ON table_name TO role_name;

收回权限

以下是一个 PostgreSQL 的 REVOKE 语句的示例,用于撤销已授予的权限:

sql
REVOKE SELECT, INSERT, UPDATE
ON my_table
FROM my_role;

这个语句将从 my_role 角色中撤销对 my_table 表的 SELECTINSERTUPDATE 权限。

如果你想要撤销所有权限,可以使用 ALL PRIVILEGES 关键字:

sql
REVOKE ALL PRIVILEGES
ON my_table
FROM my_role;

这个语句将从 my_role 角色中撤销对 my_table 表的所有权限。

如果你想要撤销授予其他角色的权限,可以使用 GRANTED BY 子句:

sql
REVOKE SELECT, INSERT, UPDATE
ON my_table
FROM my_role
GRANTED BY other_role;

这个语句将从 other_role 角色中撤销对 my_table 表的 SELECTINSERTUPDATE 权限,并且只有当这些权限是由 other_role 授予给 my_role 时才会生效。

最后,如果你想要在撤销权限时同时删除依赖于该权限的对象,可以使用 CASCADE 选项。如果你只想要在没有依赖项的情况下才能撤销权限,则可以使用 RESTRICT 选项。例如:

sql
REVOKE SELECT, INSERT, UPDATE
ON my_table
FROM my_role
CASCADE;

这个语句将从 my_role 角色中撤销对 my_table 表的 SELECTINSERTUPDATE 权限,并且将删除依赖于这些权限的任何对象。

列级

以下是一个 PostgreSQL 的 REVOKE 语句的示例,用于撤销已授予的权限:

sql
REVOKE SELECT (column_name)
ON my_table
FROM my_role;

这个语句将从 my_role 角色中撤销对 my_table 表中 column_name 列的 SELECT 权限。

如果你想要撤销所有权限,可以使用 ALL PRIVILEGES 关键字:

sql
REVOKE ALL PRIVILEGES (column_name)
ON my_table
FROM my_role;

这个语句将从 my_role 角色中撤销对 my_table 表中 column_name 列的所有权限。

如果你想要撤销授予其他角色的权限,可以使用 GRANTED BY 子句:

sql
REVOKE SELECT (column_name)
ON my_table
FROM my_role
GRANTED BY other_role;

这个语句将从 other_role 角色中撤销对 my_table 表中 column_name 列的 SELECT 权限,并且只有当这些权限是由 other_role 授予给 my_role 时才会生效。

最后,如果你想要在撤销权限时同时删除依赖于该权限的对象,可以使用 CASCADE 选项。如果你只想要在没有依赖项的情况下才能撤销权限,则可以使用 RESTRICT 选项。例如:

sql
REVOKE SELECT (column_name)
ON my_table
FROM my_role
CASCADE;

这个语句将从 my_role 角色中撤销对 my_table 表中 column_name 列的 SELECT 权限,并且将删除依赖于这些权限的任何对象。

数据库

以下是一个 PostgreSQL 的 REVOKE 语句的示例,用于撤销已授予的权限:

sql
REVOKE CREATE, CONNECT
ON DATABASE my_database
FROM my_role;

这个语句将从 my_role 角色中撤销对 my_database 数据库的 CREATECONNECT 权限。

如果你想要撤销所有权限,可以使用 ALL PRIVILEGES 关键字:

sql
REVOKE ALL PRIVILEGES
ON DATABASE my_database
FROM my_role;

这个语句将从 my_role 角色中撤销对 my_database 数据库的所有权限。

如果你想要撤销授予其他角色的权限,可以使用 GRANTED BY 子句:

sql
REVOKE CREATE, CONNECT
ON DATABASE my_database
FROM my_role
GRANTED BY other_role;

这个语句将从 other_role 角色中撤销对 my_database 数据库的 CREATECONNECT 权限,并且只有当这些权限是由 other_role 授予给 my_role 时才会生效。

最后,如果你想要在撤销权限时同时删除依赖于该权限的对象,可以使用 CASCADE 选项。如果你只想要在没有依赖项的情况下才能撤销权限,则可以使用 RESTRICT 选项。例如:

sql
REVOKE CREATE, CONNECT
ON DATABASE my_database
FROM my_role
CASCADE;

这个语句将从 my_role 角色中撤销对 my_database 数据库的 CREATECONNECT 权限,并且将删除依赖于这些权限的任何对象。

schema

以下是一个 PostgreSQL 的 REVOKE 语句的示例,用于撤销已授予的权限:

sql
REVOKE CREATE, USAGE
ON SCHEMA my_schema
FROM my_role;

这个语句将从 my_role 角色中撤销对 my_schema 模式的 CREATEUSAGE 权限。

如果你想要撤销所有权限,可以使用 ALL PRIVILEGES 关键字:

sql
REVOKE ALL PRIVILEGES
ON SCHEMA my_schema
FROM my_role;

这个语句将从 my_role 角色中撤销对 my_schema 模式的所有权限。

如果你想要撤销授予其他角色的权限,可以使用 GRANTED BY 子句:

sql
REVOKE CREATE, USAGE
ON SCHEMA my_schema
FROM my_role
GRANTED BY other_role;

这个语句将从 other_role 角色中撤销对 my_schema 模式的 CREATEUSAGE 权限,并且只有当这些权限是由 other_role 授予给 my_role 时才会生效。

最后,如果你想要在撤销权限时同时删除依赖于该权限的对象,可以使用 CASCADE 选项。如果你只想要在没有依赖项的情况下才能撤销权限,则可以使用 RESTRICT 选项。例如:

sql
REVOKE CREATE, USAGE
ON SCHEMA my_schema
FROM my_role
CASCADE;

这个语句将从 my_role 角色中撤销对 my_schema 模式的 CREATEUSAGE 权限,并且将删除依赖于这些权限的任何对象。

sql
#撤回在public模式下的权限
revoke select on all tables in schema public from 用户名;

#撤回在information_schema模式下的权限
revoke select on all tables in schema information_schema from 用户名;

#撤回在pg_catalog模式下的权限
revoke select on all tables in schema pg_catalog from 用户名;

#撤回对数据库的操作权限
revoke all on database 数据库名 from 用户名;