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
何かを見逃したのでしょうか、それともパーミッションを間違って使用していますか?