

 Amazon Redshift non supporterà più la creazione di nuove UDF Python a partire dalla Patch 198. Le UDF Python esistenti continueranno a funzionare fino al 30 giugno 2026. Per ulteriori informazioni, consulta il [post del blog](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Sicurezza e privilegi per le procedure archiviate
<a name="stored-procedure-security-and-privileges"></a>

In questo argomento vengono descritte le credenziali del database necessarie per creare ed eseguire le stored procedure.

Per impostazione predefinita, tutti gli utenti hanno l'autorizzazione a creare una procedura. Per creare una procedura, devi disporre del privilegio USAGE sulla lingua PL/pgSQL, concesso a PUBLIC per impostazione predefinita. Solo gli utenti con privilegi avanzati e i proprietari hanno per impostazione predefinita l'autorizzazione di richiamare una procedura. I superutenti possono eseguire REVOKE USAGE su PL/pgSQL un utente se desiderano impedire all'utente di creare una procedura memorizzata. 

Per richiamare una procedura, è necessaria l'autorizzazione EXECUTE per la procedura. Per impostazione predefinita, il privilegio EXECUTE per le nuove procedure viene concessa al proprietario e agli utenti con privilegi avanzati della procedura. Per ulteriori informazioni, consulta [GRANT](r_GRANT.md). 

L'utente che crea una procedura è il proprietario come impostazione predefinita. Il proprietario dispone di privilegi CREATE, DROP e EXECUTE sulla procedura come impostazione predefinita. Gli utenti con privilegi avanzati hanno tutti i privilegi. 

L'attributo SECURITY controlla i privilegi di una procedura per accedere agli oggetti del database. Quando crei una procedura archiviata, puoi impostare l'attributo SECURITY su DEFINER o INVOKER. Questo attributo determina quali privilegi vengono utilizzati durante l’esecuzione delle istruzioni nel corpo della stored procedure. Se specifichi SECURITY INVOKER, la procedura utilizza i privilegi dell'utente che la chiama. Se specifichi SECURITY INVOKER, la procedura utilizza i privilegi del proprietario che la chiama. INVOKER è l'impostazione predefinita. 

In quanto una procedura SECURITY DEFINER viene eseguita con i privilegi dell'utente proprietario della procedura, assicurarsi che la procedura non venga utilizzata impropriamente. Per assicurare che le procedure SECURITY DEFINER non vengano utilizzate impropriamente, esegui le seguenti operazioni:
+ Concedi EXECUTE alle procedure SECURITY DEFINER per specificare gli utenti e non a PUBLIC.
+ Qualificare tutti gli oggetti di database ai quali deve accedere la procedura con i nomi dello schema. Ad esempio, utilizza `myschema.mytable` invece di solo `mytable`.
+ Se non puoi qualificare un nome di oggetto in base al suo schema, imposta `search_path` durante la creazione della procedura utilizzando l'opzione SET. Imposta `search_path` per escludere qualsiasi schema che è scrivibile da parte di utenti non attendibili. Questo approccio previene che qualsiasi intermediario di questa procedura crei oggetti (ad esempio, tabelle o visualizzazioni) che mascherano gli oggetti il cui scopo è di essere utilizzati dalla procedura. Per ulteriori informazioni sull'opzione SET, consultare [CREATE PROCEDURE](r_CREATE_PROCEDURE.md). 

L'esempio seguente imposta `search_path` su `admin` per assicurare che l'accesso alla tabella `user_creds` avvenga dallo schema `admin` e non dal pubblico o da qualsiasi altro schema nel `search_path` dell'intermediario.

```
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;
```