Catégories :

Table, vue et séquence DDL

CREATE ROW ACCESS POLICY

Crée une nouvelle politique d’accès aux lignes dans le schéma actuel/spécifié ou remplace une politique d’accès aux lignes existante.

Après avoir créé une politique d’accès aux lignes, ajoutez la politique à une table à l’aide d’une commande ALTER TABLE ou à une vue à l’aide d’une commande ALTER VIEW.

Voir aussi :

Table, vue et séquence DDL

Dans ce chapitre :

Syntaxe

Snowflake prend en charge la syntaxe suivante pour créer une politique d’accès aux lignes.

CREATE [ OR REPLACE ] ROW ACCESS POLICY [ IF NOT EXISTS ] <name> AS
(<arg name> <arg type> [ , ... ]) RETURNS BOOLEAN -> <expression>
[ COMMENT = '<string_literal>' ]

Paramètres requis

nom

Identificateur de la politique d’accès à la ligne ; doit être unique pour votre schéma.

La valeur de l’identificateur doit commencer par un caractère alphabétique et ne peut pas contenir d’espaces ou de caractères spéciaux à moins que toute la chaîne d’identificateur soit délimitée par des guillemets doubles (p. ex. « Mon objet »). Les identificateurs entre guillemets doubles sont également sensibles à la casse.

Pour plus de détails, voir Exigences relatives à l’identificateur

AS ( <nom_arg> <type_arg> [ , ] )

La signature de la politique d’accès aux lignes.

Une signature spécifie un ensemble d’attributs qui doivent être pris en compte pour déterminer si la ligne est accessible. Les valeurs de l’attribut proviennent de l’objet de la base de données (par exemple, une table ou une vue) qui doit être protégé par la politique d’accès aux lignes.

RETURNS BOOLEAN -> <expression>

Détermine l’application de la politique d’accès aux lignes.

La valeur renvoyée détermine si l’utilisateur a accès à une ligne donnée de l’objet de base de données auquel la politique d’accès aux lignes est ajoutée.

L’expression peut être n’importe quelle expression SQL à valeur booléenne. Snowflake prend en charge les expressions qui appellent Fonctions définies par l’utilisateur (UDFs), Fonctions externes et les expressions qui utilisent des sous-requêtes.

Paramètres facultatifs

COMMENT = 'litéral_chaine'

Spécifie un commentaire pour la politique d’accès aux lignes.

Par défaut : aucune valeur

Notes sur l’utilisation

  • La création d’une politique d’accès aux lignes requiert le privilège CREATE ROW ACCESS POLICY sur le schéma actuel ou spécifié.

  • L’inclusion d’une ou plusieurs sous-requêtes dans le corps de la politique peut provoquer des erreurs. Dans la mesure du possible, limitez le nombre de sous-requêtes, limitez le nombre d’opérations JOIN et simplifiez les conditions des clauses WHERE.

  • Si un objet de base de données possède à la fois une politique d’accès aux lignes et une ou plusieurs politiques de masquage Sécurité au niveau des colonnes , la politique d’accès aux lignes est évaluée en premier.

    Pour plus d’informations sur les politiques d’accès aux lignes pendant l’exécution d’une requête, voir Présentation des politiques d’accès aux lignes.

  • Une colonne de table ou de vue donnée peut être spécifiée soit dans une signature de politique de masquage, soit dans une signature de politique d’accès aux lignes. En d’autres termes, la même colonne ne peut pas être spécifiée à la fois dans une signature de politique de masquage et dans une signature de politique d’accès aux lignes.

    Pour plus d’informations, voir CREATE MASKING POLICY.

  • Vous ne pouvez pas modifier la signature de la politique (c’est-à-dire le nom de l’argument ou le type de données d’entrée/sortie) en utilisant CREATE OR REPLACE ROW ACCESS POLICY si la politique est attachée à une table ou à une vue, ou en utilisant ALTER ROW ACCESS POLICY. Si vous devez modifier la signature, exécutez une instruction DROP ROW ACCESS POLICY sur la politique et créez une nouvelle politique d’accès aux lignes.

  • Un fournisseur de partage de données ne peut pas créer une politique d’accès aux lignes dans un compte de lecteur.

Exemples

La politique d’accès aux lignes suivante permet aux utilisateurs dont CURRENT_ROLE est le rôle personnalisé it_admin de voir le numéro de l’ID de l’employé (c’est-à-dire empl_id) dans le résultat de la requête.

create or replace row access policy rap_it as (empl_id varchar) returns boolean ->
  case
      when 'it_admin' = current_role() then true
      else false
  end
;

La politique d’accès aux lignes suivante permet aux utilisateurs de visualiser les données si la requête remplit l’une des deux conditions suivantes :

  1. Le rôle actuel est le rôle personnalisé sales_executive_role . Interrogez la fonction CURRENT_ROLE pour déterminer le rôle actuel.

  2. Le rôle actuel est le rôle personnalisé sales_manager et la requête spécifie un sales_region qui correspond à la table de mappage salesmanageregions .

use role securityadmin;

create or replace row access policy rap_sales_manager_regions_1 as (sales_region varchar) returns boolean ->
  'sales_executive_role' = current_role()
      or exists (
            select 1 from salesmanagerregions
              where sales_manager = current_role()
                and region = sales_region
          )
;

Où :

rap_sales_manager_regions_1

Le nom de la politique d’accès aux lignes.

as (sales_region varchar)

La signature de la politique d’accès aux lignes.

Une signature spécifie un ensemble d’attributs qui doivent être pris en compte pour déterminer si la ligne est accessible. Les valeurs des attributs proviennent de la table à protéger par la politique d’accès aux lignes.

returns boolean ->

Spécifie l’application de la politique d’accès aux lignes.

Notez que les <expression> de la politique d’accès aux lignes suivent immédiatement la flèche de droite (c’est-à-dire ->).

L’expression peut être n’importe quelle expression SQL à valeur booléenne. Snowflake prend en charge les expressions qui appellent des UDFs, des fonctions externes et des expressions qui utilisent des sous-requêtes.

'sales_executive_role' = current_role()

La première condition de l’expression de la politique d’accès aux lignes qui permet aux utilisateurs ayant le rôle personnalisé sales_executive_role de visualiser les données.

or exists (select 1 from salesmanagerregions where sales_manager = current_role() and region = sales_region)

La deuxième condition de l’expression de la politique d’accès aux lignes qui utilise une sous-requête.

La sous-requête exige que le rôle personnalisé CURRENT_ROLE soit le rôle personnalisé sales_manager et que la requête exécutée sur les données spécifie une région répertoriée dans la table de mappage salesmanagerregions .

La politique d’accès aux lignes suivante spécifie deux attributs dans la signature de la politique :

create or replace row access policy rap_test2 as (n number, v varchar)
  returns boolean -> true;

Où :

rap_test2

Le nom de la politique d’accès aux lignes.

(n number, v varchar)

La signature de la politique d’accès aux lignes.

Si cette politique est ajoutée à un objet de base de données et que l’une ou l’autre des colonnes spécifiées est incluse dans la requête sur l’objet de base de données, Snowflake ne renvoie pas la ligne dans le résultat de la requête.

returns boolean -> true

Détermine l’application de la politique d’accès aux lignes.

La valeur renvoyée détermine si l’utilisateur a accès à une ligne donnée de l’objet de base de données auquel la politique d’accès aux lignes est ajoutée.