

 从补丁 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/)。

# 使用 RLS 策略的注意事项和限制因素
注意事项和限制

## 注意事项


以下是使用 RLS 策略时的注意事项：
+ Amazon Redshift 可将 RLS 策略应用于 SELECT、UPDATE 或 DELETE 语句。
+ Amazon Redshift 不会将 RLS 策略应用于 INSERT、COPY、ALTER TABLE APPEND 语句。
+ RLS 策略可以附加到表、视图、后期绑定视图（LBV）和实体化视图（MV）。
+ 行级别安全性与列级别安全性配合使用，以保护您的数据。
+ 在为源关系启用 RLS 后，Amazon Redshift 将为超级用户、已被明确授予系统权限 IGNORE RLS 或 sys:secadmin 角色的用户支持 ALTER TABLE APPEND 语句。在这种情况下，您可以通过从现有源表移动数据，运行 ALTER TABLE APPEND 语句，以将行附加到目标表。Amazon Redshift 会将所有元组从源关系移动到目标关系中。目标关系的 RLS 状态不会影响 ALTER TABLE APPEND 语句。
+ 为了便于从其他数据仓库系统迁移，您可以通过指定变量名称和值，以设置和检索连接的自定义会话上下文变量。

  以下示例为行级别安全性 (RLS) 策略设置了会话上下文变量。

  ```
  -- Set a customized context variable.
  SELECT set_config(‘app.category’, ‘Concerts’, FALSE);
  
  -- Create a RLS policy using current_setting() to get the value of a customized context variable.
  CREATE RLS POLICY policy_categories
  WITH (catgroup VARCHAR(10)) 
  USING (catgroup = current_setting('app.category', FALSE));
  
  -- Set correct roles and attach the policy on the target table to one or more roles.
  ATTACH RLS POLICY policy_categories ON tickit_category_redshift TO ROLE analyst, ROLE dbadmin;
  ```

  有关如何设置和检索自定义会话上下文变量的详细信息，请转至 [SET](r_SET.md)、[SET\$1CONFIG](r_SET_CONFIG.md)、[SHOW](r_SHOW.md)、[CURRENT\$1SETTING](r_CURRENT_SETTING.md) 和 [RESET](r_RESET.md)。有关在一般情况下修改服务器配置的更多信息，请访问[修改服务器配置](cm_chap_ConfigurationRef.md#t_Modifying_the_default_settings)。
**重要**  
 在 RLS 策略中使用会话上下文变量时，安全策略依赖于调用该策略的用户或角色。在 RLS 策略中使用会话上下文变量时，请注意避免安全漏洞。
+ 在 DECLARE 和 FETCH 之间或后续 FETCH 语句之间使用 SET SESSION AUTHORIZATION 更改会话用户不会刷新根据 DECLARE 时的用户策略已经准备好的计划。将游标与受 RLS 保护的表一起使用时，请避免更改会话用户。
+ 当视图对象内的基础对象受 RLS 保护时，附加到运行查询的用户的策略将应用于相应的基本对象。这与对象级权限检查不同，在对象级权限检查中，根据视图基本对象检查视图所有者的权限。您可以在查询的 EXPLAIN 计划输出中查看受 RLS 保护的关系。
+ 当在附加到用户的关系的 RLS 策略中引用用户定义函数 (UDF) 时，用户必须拥有对该 UDF 的 EXECUTE 权限才能查询该关系。
+  行级安全性可能会限制查询优化。我们建议在大型数据集上部署受 RLS 保护的视图之前，仔细评估查询性能。
+  应用于后期绑定视图的行级安全策略可能会推送到联合表中。这些 RLS 策略可能在外部处理引擎日志中可见。

## 限制
限制

以下是使用 RLS 策略时的限制：
+ RLS 策略不能附加到外部表和其它几种关系类型。有关更多信息，请参阅 [ATTACH RLS POLICY](r_ATTACH_RLS_POLICY.md)。
+ Amazon Redshift 可以针对某些包含具有复杂联接的查询的 RLS 策略支持 SELECT 语句，但不支持 UPDATE 或 DELETE 语句。在使用 UPDATE 或 DELETE 语句的情况下，Amazon Redshift 将返回以下错误：

  ```
  ERROR: One of the RLS policies on target relation is not supported in UPDATE/DELETE.
  ```
+ 每当在附加到用户的关系的 RLS 策略中引用用户定义函数 (UDF) 时，用户都必须拥有对该 UDF 的 EXECUTE 权限才能查询该关系。
+ 不支持关联的子查询。Amazon Redshift 将返回以下错误：

  ```
  ERROR: RLS policy could not be rewritten.
  ```
+ Amazon Redshift 不支持与 RLS 的数据共享。如果关系没有对数据共享关闭 RLS，则使用者集群上的查询将失败，并出现以下错误：

  ```
  RLS-protected relation "rls_protected_table" cannot be accessed via datasharing query.
  ```

  您可以使用 ALTER TABLE 命令以及参数 ROW LEVEL SECURITY OFF FOR DATASHARES，关闭数据共享的 RLS。有关使用 ALTER TABLE 启用或禁用 RLS 的更多信息，请查看 [ALTER TABLE](r_ALTER_TABLE.md)。
+ 在跨数据库查询中，Amazon Redshift 会阻止读取受 RLS 保护的关系。拥有 IGNORE RLS 权限的用户可以使用跨数据库查询访问受保护的关系。当没有 IGNORE RLS 权限的用户通过跨数据库查询访问受 RLS 保护的关系时，会出现以下错误：

  ```
  RLS-protected relation "rls_protected_table" cannot be accessed via cross-database query.
  ```
+ ALTER RLS POLICY 仅支持使用 USING（using\$1predicate\$1exp）子句修改 RLS 策略。运行 ALTER RLS POLICY 时，您无法使用 WITH 子句修改 RLS 策略。
+ 如果以下任一配置选项的值与会话的默认值不匹配，则无法查询已开启行级安全性的关系：
  +  `enable_case_sensitive_super_attribute` 
  +  `enable_case_sensitive_identifier` 
  +  `downcase_delimited_identifier` 

  如果您试图查询具有行级安全性的关系，并看到消息“RLS 保护的关系不支持会话级别配置，因为区分大小写不同于其默认值”，请考虑重置会话的配置选项。
+  当您的预调配集群或无服务器命名空间具有任何行级安全策略时，普通用户将无法使用以下命令：

  ```
  ALTER <current_user> SET enable_case_sensitive_super_attribute/enable_case_sensitive_identifier/downcase_delimited_identifier
  ```

  创建 RLS 策略时，我们建议您更改普通用户的默认配置选项设置，使其与创建策略时会话的配置选项设置相匹配。超级用户和具有 ALTER USER 权限的用户可以使用参数组设置或 ALTER USER 命令来执行此操作。有关参数组的信息，请参阅《Amazon Redshift 管理指南》**中的 [Amazon Redshift 参数组](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-parameter-groups.html)。有关 ALTER USER 命令的信息，请参阅 [ALTER USER](r_ALTER_USER.md)。
+  普通用户无法使用 [CREATE VIEW](r_CREATE_VIEW.md) 命令替换具有行级安全策略的视图和后期绑定视图。要替换具有 RLS 策略的视图或 LBV，请先分离附加到这些视图的所有 RLS 策略，替换视图或 LBV，然后重新附加策略。具有 `sys:secadmin permission` 的超级用户和用户可以在具有 RLS 策略的视图或 LBV 上使用 CREATE VIEW，而无需分离策略。
+  具有行级安全策略的视图不能引用系统表和系统视图。
+  常规视图引用的后期绑定视图无法受到 RLS 保护。
+  无法在同一个查询中访问受 RLS 保护的关系和来自数据湖的嵌套数据。