- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正从 MySQL 迁移到 PostgreSQL,但在用户权限方面遇到了瓶颈。我习惯于使用以下命令为用户分配对数据库所有表的所有权限:
# MySQL
grant all privileges on mydatabase.* to 'myuser'@'localhost' identified by 'mypassword';
在我看来,PostgreSQL 9.x 解决方案涉及将权限分配给“架构”,但事实证明,我需要付出很多努力才能弄清楚要发布的 SQL 到底是什么。我知道再花几个小时的研究就会得出答案,但我认为从 MySQL 迁移到 PostgreSQL 的每个人都可以从网上至少有一页提供简单而完整的方法中受益。这是我需要为用户发出的唯一命令。我宁愿不必为每个新表发出命令。
我不知道在 PostgreSQL 中必须以不同方式处理哪些场景,因此我将列出一些我过去通常必须处理的场景。假设我们只想修改已创建的单个数据库的权限。
(1a) Not all of the tables have been created yet, or (1b) the tables have already been created.
(2a) The user has not yet been created, or (2b) the user has already been created.
(3a) Privileges have not yet been assigned to the user, or (3b) privileges were previously assigned to the user.
(4a) The user only needs to insert, update, select, and delete rows, or (4b) the user also needs to be able to create and delete tables.
我已经看到将所有权限授予所有数据库的答案,但这不是我想要的。拜托,我正在寻找一个简单的食谱,虽然我也不介意解释。
我不想向所有用户和所有数据库授予权限,这似乎是传统的捷径,因为当任何一个用户受到威胁时,这种方法就会危及所有数据库。我托管多个数据库客户端并为每个客户端分配不同的登录名。
看起来我还需要 USAGE
权限来获取 serial
列的递增值,但我必须按某种顺序授予它。我的问题变得更加复杂。
最佳答案
角色是全局对象,可以访问数据库集群中的所有数据库 - 给定所需的权限。
一个集群拥有许多数据库,这些数据库拥有许多模式。不同数据库中的模式(即使具有相同的名称)是不相关的。授予架构权限仅适用于当前数据库(授予时的当前数据库)中的此特定架构。
默认情况下,每个数据库都以 public
模式开始。这是一个约定,许多设置都是从它开始的。除此之外,public
模式与其他模式一样。
来自 MySQL,您可能希望从单个模式 public
开始,有效地完全忽略模式层。我经常为每个数据库使用几十个模式。
模式有点(但不完全)像文件系统中的目录。
一旦你使用了多个模式,一定要理解 search_path
设置:
PostgreSQL grants default privileges on some types of objects to
PUBLIC
. No privileges are granted toPUBLIC
by default on tables,columns, schemas or tablespaces. For other types, the defaultprivileges granted toPUBLIC
are as follows:CONNECT
andCREATE TEMP TABLE
for databases;EXECUTE
privilege for functions; andUSAGE
privilege for languages.
所有这些默认值都可以使用 ALTER DEFAULT PRIVILEGES
更改:
Like @Craig commented , 最好将GRANT
特权授予组角色,然后使特定用户成为该角色的成员(GRANT
将组角色授予用户角色)。这样可以更简单地处理和撤销某些任务所需的特权包。
组角色只是另一个没有登录的角色。添加登录以将其转换为用户角色。更多:
更新:Postgres 14 或更高版本添加了新的 predefined roles (正式的“默认角色”)pg_read_all_data
和 pg_write_all_data
来简化下面的一些内容。见:
比如说,我们有一个新的数据库 mydb
,一个组 mygrp
和一个用户 myusr
...
当以 super 用户身份连接到相关数据库时(例如 postgres
):
REVOKE ALL ON DATABASE mydb FROM public; -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp; -- since we revoked from public
GRANT USAGE ON SCHEMA public TO mygrp;
要像您写的那样分配“一个用户对所有表的所有权限”(我可能会更严格):
GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those
要为 future 的对象设置默认权限,请为在此模式中创建对象的每个角色运行:
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;
-- more roles?
现在,将组授予用户:
GRANT mygrp TO myusr;
相关回答:
来自 MySQL,并且由于您希望保持数据库权限分离,您可能会喜欢这种非标准设置 db_user_namespace
。 Per documentation:
This parameter enables per-database user names. It is off by default.
仔细阅读手册。我不使用此设置。它不会使上述内容无效。
关于sql - 授予 PostgreSQL 中特定数据库的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24918367/
如何授予 VSTS (TFVC) 用户从分支创建新分支的权限?我已经授予他对 ParentBranch 的“管理分支”和“合并”权限。 当他尝试从“ParentBranch”创建一个名为“ChildB
我在我的 oracle 过程中使用 dbms_crypto.encrypt 函数来加密密码。我已连接到 oracle 为: connect sqlplus as sysdba 然后授予权限: gran
如何在不连接到每一台计算机的情况下将我的 android 设备的 adb 访问权限授予我的所有计算机并按允许? 最佳答案 通过 adb 连接到设备时,每台计算机都会将代码写入 android 设备,以
我有一个 package A ,它在另一个 package B 中使用了一些变量和过程在 相同的架构 .现在想搬家package A到 新架构 .我应该授予 new schema 哪些权限用于使用 p
我需要获取数百个 MS Access DB 的元数据,因此我需要自动化元数据收集过程。 我想查询描述的内容 here ,但在查询数据库之前,我需要对 MSysObjects 进行读取 Access 表
我有一个 JApplet,我想授予它读写打印等权限。该小程序仅从本地文件系统加载 我已经阅读了java教程的控制小程序部分,并成功创建了一个策略文件,授予权限并指定代码库 http://docs.or
我正在使用 phpmyadmin 来调整用户的权限。 我删除了用户“root”的所有访问权限。现在我看不到表格了。 我尝试用另一个用户登录,但它不允许我。 此时我有什么选择? 第 1 步。 //Sto
Mysql 服务器允许从本地主机访问匿名用户。我也想将此权限扩展到其他机器...即,使用没有任何密码的匿名用户从机器 B 的 mysql 客户端访问在机器 A 中运行的 mysql_server。 我
为所有想要连接的新用户授予 MySQL 数据库访问权限的命令是什么? 考虑这个陈述: CREATE USER 'java'@'localhost' IDENTIFIED BY 'password';
我在尝试通过 t 为 mysql 用户授予数据库权限时遇到了一个问题。我认为这是因为数据库名称中的特殊字符。 这个正在工作: /usr/bin/mysql -uroot -pXz5eaCqwvsT0p
我可以在 GRANT 语句中使用静态数据库名称授予权限。 GRANT SELECT,INSERT ON database_name.table_name TO 'username'@'localhos
授予 Facebook 应用查看我的赞的权限是否允许该应用的所有其他用户也看到我的赞? 或者同一应用的其他用户能否看到我的点赞取决于我的点赞隐私设置? 例如,假设我只允许好友看到我的赞。这是否意味着该
我在这里敲了几个小时的脑袋。 我正在向数据库添加用户和密码,同时尝试授予权限。 GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,CREATE TEMPORARY TA
我正在尝试在 Flask 中创建一个自定义错误页面,我想让错误处理程序访问生成导致错误的 API 调用的请求,以便它返回的错误页面可以更改,具体取决于情况。例如,假设有两个端点: (1) @app.r
我已经编写了一个简短的快速代码来向查找器添加一个按钮,该按钮通过系统 touch 调用在当前目录中创建一个新的空白文件。该扩展可以很好地获取当前目录(通过 FIFinderSyncController
当我运行 hdf namenode -format 时,它想要删除目录 /home/hadoop/hadooptmpdata/dfs/name/current 但它没有权限执行此操作。如何授予它权限?
我正在用 C# 编写一个应用程序(对于我的一个 friend 来说,这是非常基础的),但是我有一个 StreamWriter 对象,它在 C: 中创建一个本地文件。我必须以管理员身份运行,它工作正常,
我已经安装了 Centos5,安装了 Web 服务器并设置了虚拟主机。主机几乎是这样设置的: > adduser user1 > mkdir -p /home/user1/public_html/do
我正从 MySQL 迁移到 PostgreSQL,但在用户权限方面遇到了瓶颈。我习惯于使用以下命令为用户分配对数据库所有表的所有权限: # MySQL grant all privileges on
我试图为特定用户授予对 UNC 路径的 NTFS 权限,但我看到了不同的行为,具体取决于 UNC 路径。下面是我用来授予权限的代码(来自 MSDN)以及每种情况下的结果, static void Gi
我是一名优秀的程序员,十分优秀!