CREATE FUNCTION COUNT_TEST_TAB() RETURNS INTEGER AS '
DECLARE
ln_cntval INTEGER;
BEGIN
SELECT COUNT(*) INTO ln_cntval FROM test_tab;
return ln_cntval;
END;
' LANGUAGE 'plpgsql';
test_tabへのselect権限のないユーザで実行すると、
postgres=> select COUNT_TEST_TAB();
ERROR: permission denied for relation test_tab
CONTEXT: SQL statement "SELECT COUNT(*) FROM test_tab"
PL/pgSQL function "count_test_tab" line 4 at SQL statement
コメント(2件)
実際に以下のようなユーザ定義関数を作って実験してみました。
CREATE FUNCTION COUNT_TEST_TAB() RETURNS INTEGER AS '
DECLARE
ln_cntval INTEGER;
BEGIN
SELECT COUNT(*) INTO ln_cntval FROM test_tab;
return ln_cntval;
END;
' LANGUAGE 'plpgsql';
test_tabへのselect権限のないユーザで実行すると、
postgres=> select COUNT_TEST_TAB();
ERROR: permission denied for relation test_tab
CONTEXT: SQL statement "SELECT COUNT(*) FROM test_tab"
PL/pgSQL function "count_test_tab" line 4 at SQL statement
つまり関数の実行権限以外に、その関数がテーブルにアクセスしている場合には、そのテーブルへの権限が必要となります。
grant select on test_tab to test;
というようにselect権限を与えると、結果が返ってくるようになります。
なお、CREATE FUNCTIONした直後にpublicに対して、その関数への実行が許可されていますので、必要に応じて、
revoke execute on function COUNT_TEST_TAB() from public;
とpublicから権限を剥奪しておくとよいでしょう。
すみません、この回答でポイントを付けたいくらいなのですが
どうすればいいでしょう??