根据 Snowflake 中的模式匹配删除模式

Drop schemas based on pattern match in Snowflake

从 Snowflake (ANSI SQL) 的数据库中删除所有具有用户指定前缀的模式的最佳方法是什么?

假设您有一个名为 ANALYTICS 的数据库,并且在该数据库中有多个模式,例如:dev_bob_schema1dev_bob_schema2dev_alice_schema1.

如何才能只删除那些预先设置的模式 dev_bob

我已经到了可以列出模式的阶段:

use database "ANALYTICS";
select schema_name
from information_schema.schemata
where schema_name ilike 'dev_bob%'

但我无法克服循环响应并执行 drop schema ...

的最后障碍

我会做以下事情:

  1. 使用数据库……
  2. 显示模式,例如...
  3. SELECT 'DROP SCHEMA '||”name”||';' 从 table(result_scan(last_query_id()));

将输出粘贴回工作表并运行它。

使用 INFORMATION_SCHEMA.SCHEMATA 和 Snowflake 脚本:

设置:

CREATE DATABASE ANALYTICS;
CREATE SCHEMA dev_bob_schema1;
CREATE SCHEMA dev_bob_schema2;
CREATE SCHEMA dev_bob_schema3;

查询:

SELECT LISTAGG(CONCAT('DROP SCHEMA IF EXISTS ', SCHEMA_NAME, ';', CHAR(10)) , '') AS output
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME ILIKE 'DEV_BOB_SCHEMA%';

输出:

DROP SCHEMA IF EXISTS DEV_BOB_SCHEMA1; 
DROP SCHEMA IF EXISTS DEV_BOB_SCHEMA2; 
DROP SCHEMA IF EXISTS DEV_BOB_SCHEMA3; 

All-in-one:

-- dropping schemas and generating output
DECLARE
   OUTPUT STRING DEFAULT '';
   CUR    CURSOR FOR SELECT CONCAT('DROP SCHEMA IF EXISTS ', SCHEMA_NAME) AS query
                     FROM INFORMATION_SCHEMA.SCHEMATA
                     WHERE SCHEMA_NAME ILIKE 'DEV_BOB_SCHEMA%';
BEGIN

   FOR rec IN CUR DO
       OUTPUT := OUTPUT || rec.query || CHAR(10);
       EXECUTE IMMEDIATE rec.query;
   END FOR;
   
   RETURN :OUTPUT;
END;

输出(经典UI):