我正在处理一个远程数据库,我有权只访问特定的表。
相关数据具有以下形式:
CREATE TABLE t_a(v_a VARCHAR(32), v_b VARCHAR(32));
CREATE TABLE t_b(v_b VARCHAR(32), v_c VARCHAR(32));
INSERT INTO t_a VALUES ('one', 'abc1');
INSERT INTO t_a VALUES ('two', 'abc2');
INSERT INTO t_a VALUES ('three', 'abc3');
INSERT INTO t_b VALUES ('abc1', 'eins');
INSERT INTO t_b VALUES ('abc2', 'zwei');
INSERT INTO t_b VALUES ('abc3', 'drei');
我的查询如下:
SELECT DISTINCT ON (v_a) v_a, v_c FROM t_a, t_b WHERE t_a.v_b = t_b=v_b;
现在真正的问题是:我能否在未经许可从 t_b
读取的情况下以某种方式获得相同的信息?我可以尝试另一种方法吗?
编辑
遗憾的是,我无权更改权限。我的想法是,因为我只想在 v_a
和 v_c
之间建立关联,所以我可以不从 t_b
选择任何列>。经过更多思考,我明白为什么权限系统不允许这样做 - 毕竟,我尝试从 t_b
读取一些信息。
我也希望可能有不同的权限层,其中之一允许非选择查询。
最佳答案
您可以使用拥有它或已被授权读取该表的不同帐户创建该表。您可以创建由拥有或有权读取该表的同一帐户创建的存储函数。将新功能 GRANT EXECUTE 授予您无权访问该表的个人帐户。执行新函数,就可以得到数据了。这称为 SECURITY DEFINER,更多信息可在此处阅读 http://www.postgresql.org/docs/9.3/static/sql-createfunction.html
使用此设置,您的帐户将无法直接访问该表,例如通过执行 select * from your_table。您只能通过函数访问它。同样可以用 View 来完成,这也是许多数据库设计如何设置对表的访问。函数或 View 是公共(public)接口(interface)
关于sql - 未经许可使用表的PostgreSQL查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22106792/