Amazon Redshift
数据库开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

存储过程的安全性和权限

默认情况下,所有用户都有权创建过程。要创建过程,您必须具有语言 PL/pgSQL 的 USAGE 权限,此权限在默认情况下会授予 PUBLIC。默认情况下只有超级用户和拥有者有权调用过程。如果超级用户希望阻止用户创建存储过程,则可对用户运行 PL/pgSQL 上的 REVOKE USAGE。

要调用过程,您必须授予了过程上的 EXECUTE 权限。默认情况下,新过程的 EXECUTE 权限授予过程拥有者和超级用户。有关更多信息,请参阅 GRANT

创建过程的用户默认是过程的拥有者。默认情况下,拥有者具有过程的 CREATE、DROP 和 EXECUTE 权限。超级用户拥有全部权限。

SECURITY 属性控制过程访问数据库对象的权限。在创建存储过程时,您可以将 SECURITY 属性设置为 DEFINER 或 INVOKER。如果您指定 SECURITY INVOKER,则过程使用调用该过程的用户的权限。如果您指定 SECURITY DEFINER,则过程使用该过程拥有者的权限。默认为 INVOKER。

由于 SECURITY DEFINER 过程使用拥有该过程的用户的权限运行,请注意确保没有误用该过程。为确保不会误用 SECURITY DEFINER 过程,请执行以下操作:

  • 将 SECURITY DEFINER 过程上的 EXECUTE 授予特定用户,而不是授予 PUBLIC。

  • 使用 schema 名称限定过程需要访问的所有数据库对象。例如,使用 myschema.mytable 而不是只有 mytable

  • 如果您无法通过 schema 限定其名称,请在创建过程时使用 SET 选项来设置 search_path。设置 search_path 以排除任何可由不可信用户写入的 schema。此方法防止该过程的任何调用方创建对象(例如,表或视图)来屏蔽过程所要使用的对象。有关 SET 选项的更多信息,请参阅 CREATE PROCEDURE

以下示例将 search_path 设置为 admin 以确保从 admin schema 访问 user_creds 表,而不是从调用方的 search_path 中的公共或任何其他架构访问。

CREATE OR REPLACE PROCEDURE sp_get_credentials(userid int, o_creds OUT varchar) AS $$ BEGIN SELECT creds INTO o_creds FROM user_creds WHERE user_id = $1; END; $$ LANGUAGE plpgsql SECURITY DEFINER -- Set a secure search_path SET search_path = admin;