その理由は、ビューまたはテーブルにアクセスするには追加の特権が必要なためです。データベースの特権は、データベース内のすべてのオブジェクトへのアクセスをカバーしているわけではありません。
関数によって異なります:EXECUTE publicに特権が付与されます デフォルトでは。 しかし 関数は、現在のユーザーの特権で実行されます。 SECURITY DEFINERに興味があるかもしれません CREATE FUNCTIONの修飾子 。ただし、通常はSELECTを付与するだけで十分です。 関係するテーブルで。
デフォルトの特権に関するドキュメントごと:
オブジェクトのタイプによっては、初期のデフォルトの権限に、
PUBLICにいくつかの権限を付与することが含まれる場合があります 。デフォルトでは、テーブル、列、スキーマ、およびテーブルスペースのパブリックアクセスはありません。CONNECT特権とTEMPデータベースのテーブル作成特権。EXECUTE機能の特権;およびUSAGE言語の特権。
このDDLコマンドに興味があるかもしれません(Postgres 9.0が必要です 以降):
GRANT SELECT ON ALL TABLES IN SCHEMA public TO myuser;
もちろん、問題のデータベースに接続している間(以下の@marcelのコメントを参照)、十分な権限を持つユーザーとして。 DEFAULT PRIVILEGESの設定にも興味があるかもしれません :
- データベース内の特定のスキーマのすべてをPostgreSQLのグループロールに付与します
特権を管理する方法の詳細な回答:
- データベースとスキーマのユーザーのデフォルトの特権を管理するにはどうすればよいですか?
pgAdminには、より高度な一括操作のための機能があります:
または、システムカタログをクエリして、一括付与/取り消し用のDDLステートメントを作成することもできます...