根据下面的示例,似乎不可能?
假设您的 PostgreSQL 数据库 (D) 中有两个表:表 A 和表 B。策略是任何人都可以读取或插入表 A 和表 B。PostgreSQL 数据库 (D) 存在于 PostgreSQL 数据库服务器( S)
您有一个 1.00 版的 Python 服务器(蓝色),它通过 PostgreSQL 服务器(S)连接到该 PostgreSQL 数据库(D)。
您部署了 Python 服务器(绿色)的新版本 (1.10)。它通过相同的 PostgreSQL 服务器 (S) 连接到相同的 PostgreSQL 数据库 (D)。在部署新版本 Python 服务器的过程中,您通过迁移更改策略。现在,任何人都只能读取或插入表 A。
因此,在此部署结束时,您将运行两个版本的 Python 服务器(蓝色和绿色),每个版本都通过相同的 PostgreSQL 服务器 (S) 连接到相同的 PostgreSQL 数据库 (D)。如上所述,PostgreSQL 数据库 (D) 现在有一个只允许在表 A 上读取或插入的策略。现在取消了在表 B 中读取或插入的能力。
一位用户尝试通过(蓝色)Python 服务器插入表 B。它会得到一个权限错误,因为它试图插入到表 B 但数据库策略不允许这样做。这是一个突破性的变化。
如果授权是由服务器提供的,而不是由数据库提供的,那么这个问题似乎就会消失。
- 蓝色将允许插入表 B
- 绿色不允许插入表 B
因此,不会发生重大变化。
好的,明白了,你有两个应用程序服务器连接到同一个数据库服务器和同一个数据库。
行级安全性允许您定义要用于允许或拒绝针对对象(例如表)的 DQL 和 DML 语句的逻辑。通常该逻辑基于连接到数据库的用户。但是,就您而言,听起来您希望它依赖于连接到数据库的应用程序服务器,这也是可行的。
具体说到 SQL Server(但我确信 PostgreSQL 有类似的方法),有一个系统函数调用,
HOST_NAME()
它将返回连接到数据库服务器的机器的名称。在您的情况下,这将是 Python 应用程序服务器。在您的行级安全逻辑中,您将检查该函数以确定连接的服务器是否具有访问权限。我建议将 Python 服务器名称存储在一个安全表中,以便可以更轻松地管理它们(而不是在行级安全策略中对它们进行硬编码)。
这将允许您实时允许一个 Python 服务器访问,同时拒绝另一个。