来自 http://www.postgresql.org/docs/9.1/static/sql-grant.html:
用法
。
对于架构,允许访问指定架构中包含的对象(假设还满足对象自身的权限要求)。从本质上讲,这允许被授权者在架构中"查找"对象。如果没有此权限,仍然可以查看对象名称,例如通过查询系统表。...
。
但是,通过psql
运行以下脚本似乎表明,尽管缺少 SELECT 权限会导致错误,但缺少 EXECUTE 权限不会,这与文档相矛盾,因为不满足"自己的权限要求"。
CREATE DATABASE testdb WITH OWNER postgres ENCODING 'UTF8';
connect testdb
CREATE ROLE testrole;
CREATE SCHEMA testschema;
GRANT USAGE ON SCHEMA testschema TO testrole;
SET search_path TO testschema;
CREATE FUNCTION testfunc ()
RETURNS VOID
AS $$
BEGIN
RAISE NOTICE 'IN TESTFUNC';
RAISE NOTICE 'Current user: %', current_user;
END;
$$
LANGUAGE plpgsql;
CREATE TABLE testtable
(
testrow INT
);
INSERT INTO testtable (testrow) VALUES (1), (2), (3);
SET ROLE testrole;
SELECT testfunc();
SELECT * FROM testtable;
RESET ROLE;
输出:
$ psql -f usage.sql
CREATE DATABASE
You are now connected to database "testdb" as user "postgres".
CREATE ROLE
CREATE SCHEMA
GRANT
SET
CREATE FUNCTION
CREATE TABLE
INSERT 0 3
SET
psql:usage.sql:27: NOTICE: IN TESTFUNC
psql:usage.sql:27: NOTICE: Current user: testrole
testfunc
----------
(1 row)
psql:usage.sql:28: ERROR: permission denied for relation testtable
RESET
我是否错过了某些内容或错误地使用了权限?
架构在这里并不重要,您看到的是函数的默认执行权限。请考虑以下摘自 CREATE FUNCTION 文档:
要记住的另一点是,默认情况下,执行权限是 授予 PUBLIC 用于新创建的函数(有关详细信息,请参阅 GRANT 信息)。您经常希望限制证券的使用 定义器功能仅对某些用户使用。为此,您必须撤销 默认公共权限,然后授予执行权限 选择性。