

 Amazon Redshift は、パッチ 198 以降、新しい 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` を使用します。
+ オブジェクト名をスキーマで修飾できない場合は、プロシージャの作成時に SET オプションを使用して `search_path` を設定します。信頼されていないユーザーが書き込むことができるすべてのスキーマを除外するように `search_path` を設定します。このアプローチにより、プロシージャで使用する予定のオブジェクトをマスクするオブジェクト (テーブルやビューなど) を、このプロシージャの呼び出し元が作成できないようにします。SET オプションの詳細については、「[CREATE PROCEDURE](r_CREATE_PROCEDURE.md)」を参照してください。

次の例では、`search_path` を `admin` に設定することで、`user_creds` テーブルに対して `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;
```