

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 配置表不允许的列
<a name="disallowed-columns"></a>

不允许的输出列配置是 AWS Clean Rooms 自定义分析规则中的一个控件，它允许您定义不允许在查询结果中投影的列列表（如果有）。此列表中引用的列被视为“不允许的输出列”。这意味着通过转换、别名或其他方式对此类列的任何引用都可能不会出现在查询的最终 SELECT（投影）中。

虽然该功能禁止在输出中直接投影列，但它并不会完全阻止通过其他机制间接推断出基础值。这些列仍然可以在投影子句（例如子查询或公用表表达式 (CTE)）中使用，前提是它们在最终投影中没有被引用。

不允许的输出列配置使您可以灵活地在表上应用和编纂控制，并根据使用案例和相应的隐私要求执行分析模板级审查。

有关如何设置此配置的更多信息，请参阅[为表添加自定义分析规则（引导流程）](add-analysis-rule.md#add-custom-analysis-rule-wizard)。

**示例**

以下示例显示了如何应用不允许的输出列控制。
+ 成员 A 与成员 B 协作。
+ 成员 B 是可以运行查询的成员。
+ 成员 A 使用 *age*、*gender*、*email* 和 *name* 列定义表 *users*。*age* 和 *name* 列是不允许的输出列。
+ 成员 B 用一组相似的列来定义表 *pets*：*age*、*gender* 和 *owner\$1name*。但是，其没有对输出列设置任何限制，这就表示可以在查询中自由投影表中的所有列。



如果成员 B 运行以下查询，则会被阻止，因为无法直接投影不允许的输出列：

```
SELECT 
  age 
FROM 
  users
```

如果成员 B 运行以下查询，则会被阻止，因为无法通过投影星号隐式投影不允许的输出列：

```
SELECT 
  * 
FROM 
  users
```

如果成员 B 运行以下查询，则会被阻止，因为无法投影不允许的输出列的转换：

```
SELECT 
  COUNT(age) 
FROM 
  users
```

如果成员 B 运行以下查询，则会被阻止，因为无法使用别名在最终投影中引用不允许的输出列：

```
SELECT 
  count_age
FROM 
  (SELECT COUNT(age) AS count_age FROM users)
```

如果成员 B 运行以下查询，则会被阻止，因为在输出中投影了转换的受限制列：

```
SELECT 
  CONCAT(name, email) 
FROM 
  users
```

如果成员 B 运行以下查询，则会被阻止，因为无法在最终投影中引用 CTE 中定义的不允许的输出列：

```
WITH cte AS (
  SELECT 
    age AS age_alias 
  FROM 
    users
)
SELECT age_alias FROM cte
```

如果成员 B 运行以下查询，则会被阻止，因为在最终投影中无法将不允许的输出列用作排序键或分区键：

```
SELECT 
  LISTAGG(gender) WITHIN GROUP (ORDER BY age) OVER (PARTITION BY age) 
FROM 
  users
```

如果成员 B 运行以下查询，则会成功，因为属于不允许的输出列的列仍然可以在查询中的其他构造中使用，例如在联接或筛选子句中。

```
SELECT
  u.name, 
  p.gender, 
  p.age
FROM 
  users AS u
JOIN 
  pets AS p
ON 
  u.name = p.owner_name
```

在同一场景中，成员 B 还可以使用 *users* 中的 *name* 列作为筛选器或排序键：

```
SELECT 
  u.email,
  u.gender
FROM 
  users AS u
WHERE 
  u.name = 'Mike'
ORDER BY
  u.name
```

此外，*用户*不允许的输出列可用于中间投影，例如子查询和 CTEs，例如：

```
WTIH cte AS (
 SELECT 
   u.gender, 
   u.id,
   u.first_name
 FROM
   users AS u
)
SELECT 
  first_name 
FROM
  (SELECT cte.gender, cte.id, cte.first_name FROM cte)
```