使用分析规则限制数据访问权限
本文档介绍了 GoogleSQL for BigQuery 中的分析规则的一般信息。
什么是分析规则?
分析规则会强制执行数据共享政策。政策表示在运行查询之前需要满足的条件。借助 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 值。此值是 JSON 数字,介于
0.001
到1e+15
之间。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 版。