如何防止人们在 Snowflake 表上运行 SELECT *?

Fel*_*ffa 6 sql snowflake-cloud-data-platform

出于合规性原因,我们希望阻止 SQL 分析师SELECT *在表上运行。相反,我们希望强制他们明确询问他们想要选择的列。我如何使用 Snowflake 来强制执行此操作?

我看到 SQL Server 使用计算列的提示,Snowflake 有等效的吗?

在此输入图像描述

Fel*_*ffa 7

当然,您可以在 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)

行动中:

在此输入图像描述


Mik*_*ton 7

为什么不使用行访问策略呢?这可能需要一些调整,但您可以创建类似于以下内容的行访问策略:

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 ,则将此策略应用于表不会返回任何记录。您可以将此策略应用于每个表,并且它不会以任何方式影响您的架构。


Luk*_*zda 6

这是一种解决方法,并且根据定义,解决方法并不是理想的解决方案。我想知道是否有某种方法可以向用户发送一条消息,表明是 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)

输出:

在此输入图像描述

  • 为了这。作为一种解决方法,让用户知道这是故意避免“select *”的能力比“除以零”要好得多,后者会令人困惑。 (2认同)