

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 存储过程的安全性和权限
<a name="stored-procedure-security-and-privileges"></a>

本主题介绍创建和运行存储过程所需的数据库凭证。

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

要调用过程，您必须被授予了过程上的 EXECUTE 权限。默认情况下，新过程的 EXECUTE 权限授予过程拥有者和超级用户。有关更多信息，请参阅 [GRANT](r_GRANT.md)。

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

SECURITY 属性控制过程访问数据库对象的权限。在创建存储过程时，您可以将 SECURITY 属性设置为 DEFINER 或 INVOKER。此属性决定在执行存储过程正文中的语句时使用哪些权限。如果您指定 SECURITY INVOKER，则过程使用调用该过程的用户的权限。如果您指定 SECURITY DEFINER，则过程使用该过程拥有者的权限。默认为 INVOKER。

由于 SECURITY DEFINER 过程使用拥有该过程的用户的权限运行，因此您必须确保没有误用该过程。为确保不会误用 SECURITY DEFINER 过程，请执行以下操作：
+ 将 SECURITY DEFINER 过程上的 EXECUTE 授予特定用户，而不是授予 PUBLIC。
+ 使用架构名称限定过程需要访问的所有数据库对象。例如，使用 `myschema.mytable` 而不是只有 `mytable`。
+ 如果您无法通过 schema 限定其名称，请在创建过程时使用 SET 选项来设置 `search_path`。设置 `search_path` 以排除任何可由不可信用户写入的 schema。此方法防止该过程的任何调用方创建对象（例如，表或视图）来屏蔽过程所要使用的对象。有关 SET 选项的更多信息，请参阅 [CREATE PROCEDURE](r_CREATE_PROCEDURE.md)。

以下示例将 `search_path` 设置为 `admin` 以确保从 `user_creds` schema 访问 `admin` 表，而不是从调用方的 `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;
```