使用分析规则限制数据访问权限
本文档提供了有关 GoogleSQL for BigQuery 中分析规则的一般信息。
什么是分析规则?
分析规则用于强制执行数据共享policies。政策表示在运行查询之前需要满足的条件。借助 BigQuery,您可以使用数据净化室或直接将分析规则应用于视图,对视图强制执行分析规则。强制执行分析规则后,所有查询该视图的用户都必须遵守该视图的分析规则。如果符合分析规则,则查询会生成符合分析规则的输出。如果查询不符合分析规则,则会生成一个错误。
支持的分析规则
支持以下分析规则:
汇总阈值分析规则:强制规定数据集中必须存在的不同实体的数量下限。您可以使用 DDL 语句或数据净室对视图强制执行此规则。此规则支持聚合阈值政策和联接限制政策。
差分隐私分析规则:强制执行隐私预算,当数据受到差分隐私保护时,该预算会限制向订阅者透露的数据。您可以使用 DDL 语句或数据净室对视图强制执行此规则。此规则支持差分隐私政策和联接限制政策。
列表重叠分析规则:只有在执行符合规则的联接操作后,才能查询重叠行。您可以使用 DDL 语句或数据净室对视图强制执行此规则。此规则支持联接限制政策。
汇总阈值分析规则
汇总阈值分析规则强制规定了必须对查询的输出行做出贡献的不同实体的数量下限,以便该输出行包含在查询结果中。
如果强制执行,聚合阈值分析规则将跨维度对数据进行分组,同时确保满足聚合阈值。它会计算每个组的不同隐私单元(由隐私单元列表示)的数量,并且仅输出不同隐私单元计数满足聚合阈值的组。
包含此分析规则的视图必须包含汇总阈值政策,并且可以选择包含联接限制政策。
为视图定义汇总阈值分析规则
您可以在数据净室中或使用 CREATE VIEW
语句为视图定义汇总阈值分析规则:
CREATE OR REPLACE VIEW VIEW_NAME OPTIONS ( privacy_policy= '{ "aggregation_threshold_policy": { "threshold" : THRESHOLD, "privacy_unit_column": "PRIVACY_UNIT_COLUMN" }, "join_restriction_policy": { "join_condition": "JOIN_CONDITION", "join_allowed_columns": JOIN_ALLOWED_COLUMNS } }' ) AS QUERY;
定义:
aggregation_threshold_policy
:聚合阈值分析规则的聚合阈值政策。VIEW_NAME:视图的路径和名称。
THRESHOLD:需要对查询结果中的每一行产生影响的不同隐私单元的最小数量。如果某个潜在行不满足此阈值,则查询结果中将省略该行。
PRIVACY_UNIT_COLUMN:表示隐私单元列。隐私权单元列是隐私权单元的唯一标识符。隐私权单元是隐私单元列中的值,它表示一组数据中的受保护实体。
您只能使用一个隐私单位列,且隐私单位列的数据类型必须可分组。
隐私单元列中的值无法通过查询直接映射,且您只能使用分析规则支持的汇总函数来汇总此列中的数据。
join_restriction_policy
(可选):聚合阈值分析规则的可选联接限制政策。JOIN_CONDITION:要对视图强制执行的关联限制的类型。可以是下列值之一:
JOIN_ALL
:如需查询此视图,join_allowed_columns
中的所有列都必须进行内连接。JOIN_ANY
:如需查询此视图,join_allowed_columns
中必须联接至少一列。JOIN_BLOCKED
:此视图无法按任何列联接。在这种情况下,请勿设置join_allowed_columns
。JOIN_NOT_REQUIRED
:无需联接即可查询此视图。如果使用联接,则只能使用join_allowed_columns
中的列。
JOIN_ALLOWED_COLUMNS:可以执行联接操作的列。
QUERY:视图的查询。
示例:
在以下示例中,系统会针对名为 ExamView
的视图创建汇总阈值分析规则。ExamView
引用名为 ExamTable
的表:
CREATE OR REPLACE VIEW mydataset.ExamView
OPTIONS(
privacy_policy= '{"aggregation_threshold_policy": {"threshold": 3, "privacy_unit_column": "last_name"}}'
)
AS ( SELECT * FROM mydataset.ExamTable );
如需查看 CREATE VIEW
的 privacy_policy
语法,请参阅 CREATE VIEW
中的 OPTIONS
列表。
更新视图的汇总阈值分析规则
您可以在数据净室中或使用 ALTER VIEW
语句更改视图的汇总阈值分析规则:
ALTER VIEW VIEW_NAME SET OPTIONS ( privacy_policy= '{ "aggregation_threshold_policy": { "threshold" : THRESHOLD, "privacy_unit_column": "PRIVACY_UNIT_COLUMN" } }' )
如需详细了解您可以在上述语法中为隐私权政策设置的值,请参阅为视图定义汇总阈值分析规则。
示例:
在以下示例中,系统会更新名为 ExamView
的视图上的聚合阈值分析规则。
ALTER VIEW mydataset.ExamView
SET OPTIONS (
privacy_policy= '{"aggregation_threshold_policy": {"threshold": 50, "privacy_unit_column": "last_name"}}'
);
如需查看 ALTER VIEW
的 privacy_policy
译法,请参阅 ALTER VIEW SET OPTIONS
中的 OPTIONS
列表。
查询聚合阈值分析规则强制执行的视图
您可以使用 AGGREGATION_THRESHOLD
子句查询具有汇总阈值分析规则的视图。该查询必须包含聚合函数,且您只能在此查询中使用聚合阈值支持的聚合函数。
示例:
在以下示例中,系统会针对名为 ExamView
的视图查询汇总阈值分析规则:
SELECT WITH AGGREGATION_THRESHOLD
test_id, COUNT(DISTINCT last_name) AS student_count
FROM mydataset.ExamView
GROUP BY test_id;
/*---------+---------------*
| test_id | student_count |
+---------+---------------+
| P91 | 3 |
| U25 | 4 |
*---------+---------------*/
汇总阈值分析规则还可以选择包含联接限制政策。如需了解如何将联接限制政策与分析规则搭配使用,请参阅分析规则中的联接限制政策。
如需查看 AGGREGATION_THRESHOLD
子句的其他示例,请参阅 AGGREGATION_THRESHOLD
子句。
差分隐私分析规则
差分隐私分析规则强制执行隐私预算,当数据受到差分隐私保护时,该预算会限制向订阅者透露的数据。当所有查询的 Epsilon 值之和达到下面的总 Epsilon 值,或所有查询的 Delta 值之和达到总 Delta 值时,隐私预算会阻止任何订阅方查询共享数据。您可以在视图中使用此分析规则。
包含此分析规则的视图必须包含差分隐私权政策,并且可以选择包含联接限制政策。
为视图定义差分隐私分析规则
您可以在数据净室中为视图定义差分隐私分析规则,也可以使用 CREATE VIEW
语句进行定义:
CREATE OR REPLACE VIEW VIEW_NAME OPTIONS ( privacy_policy= '{ "differential_privacy_policy": { "privacy_unit_column": "PRIVACY_UNIT_COLUMN", "max_epsilon_per_query": MAX_EPSILON_PER_QUERY, "epsilon_budget": EPSILON_BUDGET, "delta_per_query": DELTA_PER_QUERY, "delta_budget": DELTA_BUDGET, "max_groups_contributed": MAX_GROUPS_CONTRIBUTED }, "join_restriction_policy": { "join_condition": "JOIN_CONDITION", "join_allowed_columns": JOIN_ALLOWED_COLUMNS } }' ) AS QUERY;
定义:
differential_privacy_policy
:差分隐私分析规则的差分隐私政策。PRIVACY_UNIT_COLUMN:用于标识数据集中使用隐私分析规则保护的实体的列。此值为 JSON 字符串。
MAX_EPSILON_PER_QUERY:确定每次查询向结果添加的噪声量,并防止单次查询达到总 Epsilon 值。此值是一个介于
0.001
和1e+15
之间的 JSON 数字。EPSILON_BUDGET:epsilon 预算,表示可在视图上的所有差分隐私查询中使用的总 epsilon。此值必须大于
MAX_EPSILON_PER_QUERY
,并且是一个介于0.001
和1e+15
之间的 JSON 数字。DELTA_PER_QUERY:结果中任何一行未能达到 epsilon 差分隐私的概率。此值是一个介于
1e-15
和1
之间的 JSON 数字。DELTA_BUDGET:增量预算,表示可在视图上的所有差分隐私查询中使用的总增量。此值必须大于
DELTA_PER_QUERY
,并且是一个介于1e-15
和1000
之间的 JSON 数字。MAX_GROUPS_CONTRIBUTED(可选):限制隐私单元列中实体可以贡献的组数。该值必须是非负 JSON 整数。
join_restriction_policy
(可选):差分隐私分析规则的可选联接限制政策。JOIN_CONDITION:要对视图强制执行的关联限制的类型。可以是下列值之一:
JOIN_ALL
:如需查询此视图,join_allowed_columns
中的所有列都必须进行内连接。JOIN_ANY
:如需查询此视图,join_allowed_columns
中必须联接至少一列。JOIN_BLOCKED
:此视图无法按任何列联接。在这种情况下,请勿设置join_allowed_columns
。JOIN_NOT_REQUIRED
:无需联接即可查询此视图。如果使用联接,则只能使用join_allowed_columns
中的列。
JOIN_ALLOWED_COLUMNS:可以执行联接操作的列。
QUERY:视图的查询。
示例:
在以下示例中,系统会针对名为 ExamView
的视图创建差分隐私分析规则。ExamView
引用名为 ExamTable
的表:
CREATE OR REPLACE VIEW mydataset.ExamView
OPTIONS(
privacy_policy= '{"differential_privacy_policy": {"privacy_unit_column": "last_name", "max_epsilon_per_query": 1000.0, "epsilon_budget": 10000.1, "delta_per_query": 0.01, "delta_budget": 0.1, "max_groups_contributed": 2}}'
)
AS ( SELECT * FROM mydataset.ExamTable );
-- NOTE: Delta and epsilon parameters are set very high due to the small
-- dataset. In practice, these should be much smaller.
如需查看 CREATE VIEW
的 privacy_policy
语法,请参阅 CREATE VIEW
中的 OPTIONS
列表。
更新视图的差分隐私分析规则
您可以在数据净室中或使用 ALTER VIEW
语句更改视图的差分隐私分析规则:
ALTER VIEW VIEW_NAME SET OPTIONS ( privacy_policy= '{ "differential_privacy_policy": { "privacy_unit_column": "PRIVACY_UNIT_COLUMN", "max_epsilon_per_query": MAX_EPSILON_PER_QUERY, "epsilon_budget": EPSILON_BUDGET, "delta_per_query": DELTA_PER_QUERY, "delta_budget": DELTA_BUDGET, "max_groups_contributed": MAX_GROUPS_CONTRIBUTED } }' )
如需详细了解您可以在上述语法中为隐私权政策设置的值,请参阅为视图定义差分隐私分析规则。
示例:
在以下示例中,系统会针对名为 ExamView
的视图更新差分隐私分析规则。
ALTER VIEW mydataset.ExamView
SET OPTIONS(
privacy_policy= '{"differential_privacy_policy": {"privacy_unit_column": "last_name", "max_epsilon_per_query": 0.01, "epsilon_budget": 1000.0, "delta_per_query": 0.05, "delta_budget": 0.1, "max_groups_contributed": 2}}'
);
-- NOTE: Delta and epsilon parameters are set very high due to the small
-- dataset. In practice, these should be much smaller.
如需查看 ALTER VIEW
的 privacy_policy
语法,请参阅 ALTER VIEW SET OPTIONS
中的 OPTIONS
列表。
查询差分隐私分析规则强制执行的视图
您可以使用 DIFFERENTIAL_PRIVACY
子句查询具有差分隐私分析规则的视图。如需查看 DIFFERENTIAL_PRIVACY
子句的语法和其他示例,请参阅 DIFFERENTIAL_PRIVACY
子句。
示例:
在以下示例中,系统会针对名为 ExamView
的视图查询差分隐私分析规则。差分隐私数据应从 ExamView
成功返回,因为 epsilon
、delta
和 max_groups_contributed
都满足 ExamView
中差异分析规则的条件。
-- Query an analysis–rule enforced view called ExamView.
SELECT
WITH DIFFERENTIAL_PRIVACY
test_id,
AVG(test_score) AS average_test_score
FROM mydataset.ExamView
GROUP BY test_id;
-- Results will vary.
/*---------+--------------------*
| test_id | average_test_score |
+---------+--------------------+
| P91 | 512.627693163311 |
| C83 | 506.01565971561649 |
| U25 | 524.81202728847893 |
*---------+--------------------*/
屏蔽 epsilon 超出范围的查询
可以使用 Epsilon 添加或移除噪声。epsilon 越大,添加的噪声就越少。如果您想确保差分隐私查询的噪声量最小,请密切关注差分隐私分析规则中 max_epsilon_per_query
的值。
示例:
在以下查询中,由于 DIFFERENTIAL_PRIVACY
子句中的 epsilon
高于 ExamView
中的 max_epsilon_per_query
,因此查询会被阻止并报错:
-- Create a view that includes a table called ExamTable.
CREATE OR REPLACE VIEW mydataset.ExamView
OPTIONS(
privacy_policy= '{"differential_privacy_policy": {"privacy_unit_column": "last_name", "max_epsilon_per_query": 10.01, "epsilon_budget": 1000.0, "delta_per_query": 0.01, "delta_budget": 0.1, "max_groups_contributed": 2}}'
)
AS ( SELECT * FROM mydataset.ExamTable );
-- NOTE: Delta and epsilon parameters are set very high due to the small
-- dataset. In practice, these should be much smaller.
创建视图后,请稍等片刻,然后运行以下查询:
-- Error: Epsilon is too high: 1e+20, policy for table mydataset.
-- ExamView allows max 10.01
SELECT
WITH DIFFERENTIAL_PRIVACY
OPTIONS(epsilon=1e20)
test_id,
AVG(test_score) AS average_test_score
FROM mydataset.ExamView
GROUP BY test_id;
屏蔽超出 epsilon 预算的查询
可以使用 Epsilon 添加或移除噪声。较小的 epsilon 会增加噪声,较大的 epsilon 会减少噪声。即使噪声较高,对同一数据的多个查询最终也会揭示数据的无噪声版本。为避免这种情况,您可以创建一个 epsilon 预算。如果您想添加 epsilon 预算,请查看视图的差分隐私分析规则中的 epsilon_budget
值。
示例:
请运行以下查询三次。第三次,由于使用的总 epsilon 为 30
,但 ExamView
中的 epsilon_budget
仅允许 25.6
,因此查询会被屏蔽:
-- Create a view that includes a table called ExamTable.
CREATE OR REPLACE VIEW mydataset.ExamView
OPTIONS(
privacy_policy= '{"differential_privacy_policy": {"privacy_unit_column": "last_name", "max_epsilon_per_query": 10.01, "epsilon_budget": 25.6, "delta_per_query": 0.01, "delta_budget": 0.1, "max_groups_contributed": 2}}'
)
AS ( SELECT * FROM mydataset.ExamTable );
-- NOTE: Delta and epsilon parameters are set very high due to the small
-- dataset. In practice, these should be much smaller.
创建视图后,请稍等片刻,然后三次运行以下查询:
-- Error after three query runs: Privacy budget is not sufficient for
-- table 'mydataset.ExamView' in this query.
SELECT
WITH DIFFERENTIAL_PRIVACY
OPTIONS(epsilon=10)
test_id,
AVG(test_score) AS average_test_score
FROM mydataset.ExamView
GROUP BY test_id;
列表重叠分析规则
只有在联接操作之后才能查询重叠的行,这符合列表重叠规则。您可以使用 DDL 语句或数据净室对视图强制执行此规则。
包含此分析规则的视图只能包含联接限制政策。
为视图定义列表重叠分析规则
您可以在数据净室中为视图定义列表重叠分析规则,也可以使用 CREATE VIEW
语句进行定义:
CREATE OR REPLACE VIEW VIEW_NAME OPTIONS ( privacy_policy= '{ "join_restriction_policy": { "join_condition": "JOIN_CONDITION", "join_allowed_columns": JOIN_ALLOWED_COLUMNS } }' ) AS QUERY;
定义:
join_restriction_policy
:列表重叠分析规则的关联限制政策。JOIN_CONDITION:要强制应用于视图的列表叠加类型。可以是下列值之一:
JOIN_ALL
:如需查询此视图,join_allowed_columns
中的所有列都必须进行内连接。JOIN_ANY
:如需查询此视图,join_allowed_columns
中必须联接至少一列。
JOIN_ALLOWED_COLUMNS:可以执行联接操作的列。
QUERY:视图的查询。
示例:
在以下示例中,系统会针对名为 ExamView
的视图创建列表重叠分析规则。ExamView
引用名为 ExamTable
的表:
-- Create a view that includes a table called ExamTable.
CREATE OR REPLACE VIEW mydataset.ExamView
OPTIONS(
privacy_policy= '{"join_restriction_policy": {"join_condition": "JOIN_ANY", "join_allowed_columns": ["test_id", "test_score"]}}'
)
AS ( SELECT * FROM mydataset.ExamTable );
更新视图的列表重叠分析规则
您可以使用数据净室或 ALTER VIEW
语句更改视图的列表重叠分析规则:
ALTER VIEW VIEW_NAME SET OPTIONS ( privacy_policy= '{ "join_restriction_policy": { "join_condition": "JOIN_CONDITION", "join_allowed_columns": JOIN_ALLOWED_COLUMNS } }' )
如需详细了解您可以在上述语法中为隐私权政策设置的值,请参阅为视图定义列表重叠分析规则。
示例:
在以下示例中,系统会更新名为 ExamView
的视图的列表重叠分析规则。
ALTER VIEW mydataset.ExamView
SET OPTIONS(
privacy_policy= '{"join_restriction_policy": {"join_condition": "JOIN_ALL", "join_allowed_columns": ["test_id", "test_score"]}}'
);
如需查看 ALTER VIEW
的 privacy_policy
语法,请参阅 ALTER VIEW SET OPTIONS
中的 OPTIONS
列表。
查询列表重叠分析规则强制执行的视图
您可以对具有列表重叠分析规则的视图执行联接操作。如需查看 JOIN
运算的语法,请参阅联接运算。
阻止不重叠的联接操作
如果联接操作不包含与必需列至少重叠一次的列,您可以阻止该联接操作。
示例:
在以下查询中,名为 ExamView
的视图已与名为 StudentTable
的表联接。由于该视图包含 JOIN_ANY
列表重叠分析规则,因此 ExamView
和 StudentTable
中必须至少包含一行重叠行。由于至少存在一个重叠项,因此查询会成功运行。
-- Create a view that includes a table called ExamTable.
CREATE OR REPLACE VIEW mydataset.ExamView
OPTIONS(
privacy_policy= '{"join_restriction_policy": {"join_condition": "JOIN_ANY", "join_allowed_columns": ["test_score", "last_name"]}}'
)
AS ( SELECT * FROM mydataset.ExamTable );
-- Query a view called ExamView and a table called StudentTable.
SELECT *
FROM mydataset.ExamView INNER JOIN mydataset.StudentTable USING (test_score);
/*------------+-----------+---------+-------------*
| test_score | last_name | test_id | last_name_1 |
+------------+-----------+---------+-------------+
| 490 | Ivanov | U25 | Ivanov |
| 500 | Wang | U25 | Wang |
| 510 | Hansen | P91 | Hansen |
| 550 | Silva | U25 | Silva |
| 580 | Devi | U25 | Devi |
*------------+-----------+---------+-------------*/
阻止不完全重叠的内联接操作
如果联接操作不包含与所有必需列的重叠部分,您可以将其屏蔽。
示例:
在以下示例中,系统尝试对名为 ExamView
的视图和名为 StudentTable
的表执行联接操作,但查询失败。发生失败的原因是 ExamView
列表重叠分析规则要求对联接限制政策中存在的所有列进行联接。由于名为 StudentTable
的表不包含这些列,因此并非所有行都重叠,并且会产生错误。
-- Create a view that includes ExamTable.
CREATE OR REPLACE VIEW mydataset.ExamView
OPTIONS(
privacy_policy= '{"join_restriction_policy": {"join_condition": "JOIN_ALL", "join_allowed_columns": ["test_score", "last_name"]}}'
)
AS ( SELECT * FROM mydataset.ExamTable );
-- Query error: Joining must occur on all of the following columns
-- [test_score, last_name] on table mydataset.ExamView.
SELECT *
FROM mydataset.ExamView INNER JOIN mydataset.StudentTable USING (last_name);
将联接限制政策与其他政策搭配使用
联接限制政策可与聚合阈值和差分隐私分析规则中的其他政策搭配使用。不过,将联接限制政策与其他政策搭配使用后,您便无法再更改该其他政策。
示例:
在以下示例中,汇总阈值分析规则中使用了联接限制政策:
-- Create a view that includes a table called ExamTable.
CREATE OR REPLACE VIEW mydataset.ExamView
OPTIONS(
privacy_policy= '{"aggregation_threshold_policy":{"threshold": 3, "privacy_unit_column": "last_name"}, "join_restriction_policy": {"join_condition": "JOIN_ANY", "join_allowed_columns": ["test_id", "test_score"]}}'
)
AS ( SELECT * FROM mydataset.ExamTable );
阻止不含必需列的联接操作
如果联接操作不包含至少一个必需列,您可以阻止该操作。为此,请在列表重叠分析规则中添加以下部分:
"join_restriction_policy": { "join_condition": "JOIN_ANY", "join_allowed_columns": ["column_name", ...] }
示例:
在以下查询中,查询会被阻止并报错,因为查询不包含 ExamView
和 StudentTable
中 test_score
或 test_id
列的任何联接操作:
-- Create a view that includes a table called ExamTable.
CREATE OR REPLACE VIEW mydataset.ExamView
OPTIONS(
privacy_policy= '{"aggregation_threshold_policy": {"threshold": 3, "privacy_unit_column": "last_name"}, "join_restriction_policy": {"join_condition": "JOIN_ANY", "join_allowed_columns": ["test_score", "test_id"]}}'
)
AS ( SELECT * FROM mydataset.ExamTable );
-- Query error: Joining must occur on at least one of the following columns
-- [test_score, test_id] on table mydataset.ExamView.
SELECT *
FROM mydataset.ExamView INNER JOIN mydataset.StudentTable USING (last_name);
如需运行上一个查询,请在 USING
子句中将 last_name
替换为 test_score
。
阻止不包含联接操作的查询
如果查询必须包含联接操作,那么您可以使用以下列表重叠分析规则之一,在没有联接操作的情况下阻止查询:
"join_restriction_policy": { "join_condition": "JOIN_NOT_REQUIRED" }
"join_restriction_policy": { "join_condition": "JOIN_NOT_REQUIRED", "join_allowed_columns": [] }
示例:
在以下查询中,由于查询中没有与 ExamView
进行联接的操作,因此查询会被阻止:
-- Create a view that includes a table called ExamTable.
CREATE OR REPLACE VIEW mydataset.ExamView
OPTIONS(
privacy_policy= '{"aggregation_threshold_policy": {"threshold": 3, "privacy_unit_column": "last_name"}, "join_restriction_policy": {"join_condition": "JOIN_NOT_REQUIRED"}}'
)
AS ( SELECT * FROM mydataset.ExamTable );
-- Query error: At least one allowed column must be specified with
-- join_condition = 'JOIN_NOT_REQUIRED'.
SELECT *
FROM mydataset.ExamView;
阻止不包含联接操作且不包含必需列的查询
如果查询必须包含联接操作,并且联接操作必须包含至少一个必需列,请在列表重叠分析规则中添加以下部分:
"join_restriction_policy": { "join_condition": "JOIN_NOT_REQUIRED", "join_allowed_columns": ["column_name", ...] }
示例:
在以下查询中,由于联接操作不包含 ExamView
join_allowed_columns
数组中的列,因此查询会被阻止:
-- Create a view that includes a table called ExamTable.
CREATE OR REPLACE VIEW mydataset.ExamView
OPTIONS(
privacy_policy= '{"aggregation_threshold_policy": {"threshold": 3, "privacy_unit_column": "last_name"}, "join_restriction_policy": {"join_condition": "JOIN_NOT_REQUIRED", "join_allowed_columns": ["test_score"]}}'
)
AS ( SELECT * FROM mydataset.ExamTable );
-- Query error: Join occurring on a restricted column.
SELECT *
FROM mydataset.ExamView INNER JOIN mydataset.StudentTable USING (last_name);
如需运行上一个查询,请在 USING
子句中将 last_name
替换为 test_score
。
阻止所有联接操作
您可以屏蔽所有联接操作。为此,请仅在列表重叠分析规则中添加以下部分:
"join_restriction_policy": { "join_condition": "JOIN_BLOCKED", }
示例:
在以下查询中,由于存在与名为 ExamView
的视图的联接操作,因此查询会被阻止:
-- Create a view that includes a table called ExamTable.
CREATE OR REPLACE VIEW mydataset.ExamView
OPTIONS(
privacy_policy= '{"aggregation_threshold_policy": {"threshold": 3, "privacy_unit_column": "last_name"}, "join_restriction_policy": {"join_condition": "JOIN_BLOCKED"}}'
)
AS ( SELECT * FROM mydataset.ExamTable );
-- Query error: Join occurring on a restricted column.
SELECT *
FROM mydataset.ExamView INNER JOIN mydataset.StudentTable USING (last_name);
如需运行前面的查询,请移除 INNER JOIN
操作。
阻止不包含所有必需列的内联接操作
如果内联接操作不包含所有必需的列,您可以将其阻止。为此,请在列表重叠分析规则中添加以下部分:
"join_restriction_policy": { "join_condition": "JOIN_ALL", "join_allowed_columns": ["column_name", ...] }
示例:
在以下查询中,由于查询在与名为 ExamView
的视图的联接操作中不包含 test_score
,因此查询会被阻止并报错:
-- Create a view that includes a table called ExamTable.
CREATE OR REPLACE VIEW mydataset.ExamView
OPTIONS(
privacy_policy= '{"aggregation_threshold_policy": {"threshold": 3, "privacy_unit_column": "last_name"}, "join_restriction_policy": {"join_condition": "JOIN_ALL", "join_allowed_columns": ["test_score", "last_name"]}}'
)
AS ( SELECT * FROM mydataset.ExamTable );
-- Query error: Joining must occur on all of the following columns
-- [test_score, last_name] on table mydataset.ExamView.
SELECT *
FROM mydataset.ExamView INNER JOIN mydataset.StudentTable USING (last_name);
如需运行上述查询,请将 USING (last_name)
替换为 USING (last_name, test_score)
。
示例表
本文档中的多个示例引用了名为 ExamTable
和 StudentTable
的两个表。ExamTable
包含学生获得的测试成绩列表,StudentTable
包含学生及其测试成绩的列表。
如需测试本文档中的示例,请先将以下示例表添加到您的项目中:
-- Create a table called ExamTable.
CREATE OR REPLACE TABLE mydataset.ExamTable AS (
SELECT "Hansen" AS last_name, "P91" AS test_id, 510 AS test_score UNION ALL
SELECT "Wang", "U25", 500 UNION ALL
SELECT "Wang", "C83", 520 UNION ALL
SELECT "Wang", "U25", 460 UNION ALL
SELECT "Hansen", "C83", 420 UNION ALL
SELECT "Hansen", "C83", 560 UNION ALL
SELECT "Devi", "U25", 580 UNION ALL
SELECT "Devi", "P91", 480 UNION ALL
SELECT "Ivanov", "U25", 490 UNION ALL
SELECT "Ivanov", "P91", 540 UNION ALL
SELECT "Silva", "U25", 550);
-- Create a table called StudentTable.
CREATE OR REPLACE TABLE mydataset.StudentTable AS (
SELECT "Hansen" AS last_name, 510 AS test_score UNION ALL
SELECT "Wang", 500 UNION ALL
SELECT "Devi", 580 UNION ALL
SELECT "Ivanov", 490 UNION ALL
SELECT "Silva", 550);
限制
分析规则存在以下限制:
- 如果您已向视图添加分析规则,则无法在汇总阈值分析规则和差分隐私分析规则之间切换。
聚合阈值分析规则存在以下限制:
- 对于聚合阈值分析规则强制执行的视图中的查询,您只能使用受支持的汇总函数。
- 您无法向具体化视图添加聚合阈值分析规则。
- 如果您在聚合阈值查询中使用聚合阈值分析规则强制执行的视图,则它们的隐私单元列中的值必须相同。
- 如果您在汇总阈值查询中使用汇总阈值分析规则强制执行的视图,则查询中的阈值必须大于或等于视图中的阈值。
- 任何具有汇总阈值分析规则的视图中都会停用时间旅行功能。
差分隐私分析规则存在以下限制:
- 视图的隐私预算用尽后,该视图将无法再使用,您必须创建一个新视图。
列表重叠分析规则存在以下限制:
- 如果您将汇总阈值分析规则或差分隐私分析规则与列表重叠分析规则组合使用,并且未在列表重叠分析规则中将
privacy_unit_column
作为join_allowed_column
放置,则在某些情况下,您可能无法联接任何列。
价格
- 向视图附加分析规则不会产生额外费用。
- 分析适用标准 BigQuery 价格。
- 包含分析规则的视图上的查询仅限于非版本产品或企业 Plus 版。