我需要授予客户对我的数据库中一组“视图”的访问权限。我已经成功地使用户/角色可以针对所需的视图进行SELECT操作,而不是任何表格。但是,用户/角色仍然可以浏览模式,并查看表格和表格列以及数据类型等等。有没有一种方法可以防止这种情况发生?如果用户/角色使用PgAdmin III或psql或类似的东西访问数据库,他们只能“看到”授权视图,而不会看到其他任何内容吗?
我需要授予客户对我的数据库中一组“视图”的访问权限。我已经成功地使用户/角色可以针对所需的视图进行SELECT操作,而不是任何表格。但是,用户/角色仍然可以浏览模式,并查看表格和表格列以及数据类型等等。有没有一种方法可以防止这种情况发生?如果用户/角色使用PgAdmin III或psql或类似的东西访问数据库,他们只能“看到”授权视图,而不会看到其他任何内容吗?
如果您希望承包商能够访问视图但不能查看视图所绘制数据的表结构,那么唯一的选择是将这些视图实例化为实际的表(例如使用CREATE TABLE AS SELECT ...
),然后将其转储并恢复到您不信任的承包商可以访问的数据库中。
您的应用程序可能是 Web 应用程序或类似应用程序,不会使数据库登录数据暴露给用户;否则,您将面临比此问题更大的问题。
我认为你无法阻止承包商查看类型。问题在于这些类型存储在同一系统表中,如果您撤销对这些表的权限,我非常担心会发生什么事情。实际上,我怀疑什么都不会起作用。
PostgreSQL没有限制访问类型定义的概念。
但是,您可以通过限制对表的选择访问来防止他们从表中选择数据。视图在定义它们的用户的本地权限下运行。您可以在基础表上撤销权限,并使其仍然可以访问视图中的数据。但是,您无法阻止他们查看基础表的类型定义。
换句话说,更面向对象的方式,您不能安全地允许PostgreSQL用户查看您的类定义。但是,您可以防止他们查看实际对象。
编辑:我知道的唯一受此限制的系统目录是包括加密密码的目录。大多数系统目录相对开放,很多代码需要具有对这些目录的权限。鉴于PostgreSQL的对象行为,我认为您无法限制对函数定义(在编译环境中,这不是源代码,而是包括例程的共享对象文件)或类型定义(包括表结构)的访问。
编辑2:实际上有一个单一的好答案,那就是不要通过直接工具(如psql)给承包商访问数据库的权限,而是要求他们通过你控制的某些中间件进行访问。然后,你可以完全控制他们能看到什么或不能看到什么。例如,如果你想要的话,你可以修改phppgadmin以拒绝显示pg_catalog模式中的任何内容。但这是hack-the-tool领域,你不想在系统表权限上瞎搞。
如果您想避免在物化视图中重复所有数据..
您可以设置另一个数据库 - 在不同的群集中,因此它不共享相同的目录。这甚至可以在不同的机器上。
SELECT
。现在他们根本无法访问基本表。