Fel*_*ffa 6 sql snowflake-cloud-data-platform
出于合规性原因,我们希望阻止 SQL 分析师SELECT *在表上运行。相反,我们希望强制他们明确询问他们想要选择的列。我如何使用 Snowflake 来强制执行此操作?
我看到 SQL Server 使用计算列的提示,Snowflake 有等效的吗?
当然,您可以在 Snowflake 中创建带有派生/计算列的表:
create or replace table mytable (
i number, s string
, no_select_star number as (1/0));
Run Code Online (Sandbox Code Playgroud)
一旦该表有数据,您将无法对其运行select *,因为除以 0 是无效数字:
您还可以将计算列附加到现有表以获得相同的效果:
alter table mytable2
add column no_select_star number as (1/0);
Run Code Online (Sandbox Code Playgroud)
行动中:
为什么不使用行访问策略呢?这可能需要一些调整,但您可以创建类似于以下内容的行访问策略:
create or replace row access policy test_policy as (val varchar) returns boolean ->
case
when lower(current_statement()) like '%select%*%'
then false else true end;
Run Code Online (Sandbox Code Playgroud)
select *如果查询中存在a ,则将此策略应用于表不会返回任何记录。您可以将此策略应用于每个表,并且它不会以任何方式影响您的架构。
这是一种解决方法,并且根据定义,解决方法并不是理想的解决方案。我想知道是否有某种方法可以向用户发送一条消息,表明是 select * 导致了错误。我尝试了一个抛出错误的 JS UDF,但它不能用作列的默认值。
可以使用截断错误来显示自定义消息:
create or replace table mytable (
i number, s string
, no_select_star string as ('Code smell: SELECT * '::CHAR(1))
);
INSERT INTO mytable(i, s) VALUES (1, 'a');
Run Code Online (Sandbox Code Playgroud)
询问:
SELECT * FROM mytable;
Run Code Online (Sandbox Code Playgroud)
输出: