使用分析规则限制数据访问权限
本文档简要介绍了 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 预算。此值是介于
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 价格。