1

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

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

4

1 に答える 1

2

ここで重要なのはスキーマではありません。表示されているのは、関数のデフォルトの実行権限です。CREATE FUNCTION ドキュメントからのこの抜粋を検討してください。

留意すべきもう 1 つのポイントは、デフォルトで、新しく作成された関数の実行権限が PUBLIC に付与されることです (詳細については、GRANT を参照してください)。一部のユーザーのみにセキュリティ定義関数の使用を制限したい場合がよくあります。これを行うには、デフォルトの PUBLIC 権限を取り消してから、実行権限を選択的に付与する必要があります。

于 2012-12-17T19:00:28.140 に答える