

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 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`。
+ 如果您無法以結構描述來限定物件名稱，請在建立程序時使用 SET 選項來設定 `search_path`。設定 `search_path` 來排除不受信任使用者所能撰寫的任何結構描述。此方法防止此程序的任何發起人建立物件 (例如，資料表或檢視)，而遮罩應該由程序使用的物件。如需 SET 選項的相關資訊，請參閱 [CREATE PROCEDURE](r_CREATE_PROCEDURE.md)。

下列範例將 `search_path` 設為 `admin`，以確保從 `admin` 結構描述存取 `user_creds` 資料表，而不是從 public 或發起人的 `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;
```