我们在雪花实例上执行 Flyway clean 命令时遇到错误,错误 ASSOCIATE_SEMANTIC_CATEGORY_TAGS' 不存在或未授权。
然而,这是雪花提供的存储过程,我们不拥有它,并且它不属于任何模式。
下面是 StackTrace
024-02-27T14:12:10.5828869Z 消息:SQL 编译错误: 2024-02-27T14:12:10.5829911Z 过程“..ASSOCIATE_SEMANTIC_CATEGORY_TAGS”不存在或未授权。 2024-02-27T14:12:10.5830338Z 2024-02-27T14:12:10.5831459Z 在 org.flywaydb.core.internal.database.base.Schema.clean(Schema.java:123) ~[flyway-core-8.5.0.jar!/:?] 2024-02-27T14:12:10.5832649Z 在 org.flywaydb.core.internal.command.DbClean.lambda$doCleanSchema$3(DbClean.java:216) ~[flyway-core-8.5.0.jar!/:?] 2024-02-27T14:12:10.5833975Z 在 org.flywaydb.core.internal.jdbc.TransactionalExecutionTemplate.execute(TransactionalExecutionTemplate.java:55) ~[flyway-core-8.5.0.jar!/:?] 2024-02-27T14:12:10.5835289Z 在 org.flywaydb.core.internal.command.DbClean.doCleanSchema(DbClean.java:215) ~[flyway-core-8.5.0.jar!/:?] 2024-02-27T14:12:10.5836784Z 在 org.flywaydb.core.internal.command.DbClean.cleanSchema(DbClean.java:208) ~[flyway-core-8.5.0.jar!/:?] 2024-02-27T14:12:10.5837880Z 在 org.flywaydb.core.internal.command.DbClean.cleanSchemas(DbClean.java:196) ~[flyway-core-8.5.0.jar!/:?] 2024-02-27T14:12:10.5839210Z 在 org.flywaydb.core.internal.command.DbClean.clean(DbClean.java:112) ~[flyway-core-8.5.0.jar!/:?] 2024-02-27T14:12:10.5840542Z 在 org.flywaydb.core.internal.command.DbClean.clean(DbClean.java:90) ~[flyway-core-8.5.0.jar!/:?] 2024-02-27T14:12:10.5841707Z 在 org.flywaydb.core.internal.command.DbClean.clean(DbClean.java:76) ~[flyway-core-8.5.0.jar!/:?] 2024-02-27T14:12:10.5842839Z 在 org.flywaydb.core.internal.command.DbClean.clean(DbClean.java:67) ~[flyway-core-8.5.0.jar!/:?] 2024-02-27T14:12:10.5844539Z 在 org.flywaydb.core.Flyway.doClean(Flyway.java:367) ~[flyway-core-8.5.0.jar!/:?] 2024-02-27T14:12:10.5845578Z 在 org.flywaydb.core.Flyway.access$400(Flyway.java:56) ~[flyway-core-8.5.0.jar!/:?] 2024-02-27T14:12:10.5846573Z 在 org.flywaydb.core.Flyway$3.execute(Flyway.java:214) ~[flyway-core-8.5.0.jar!/:?] 2024-02-27T14:12:10.5847475Z 在 org.flywaydb.core.Flyway$3.execute(Flyway.java:211) ~[flyway-core-8.5.0.jar!/:?] 2024-02-27T14:12:10.5848448Z 在 org.flywaydb.core.FlywayExecutor.execute(FlywayExecutor.java:207) ~[flyway-core-8.5.0.jar!/:?] 2024-02-27T14:12:10.5849503Z 在 org.flywaydb.core.Flyway.clean(Flyway.java:211) ~[flyway-core-8.5.0.jar!/:?] 2024-02-27T14:12:10.5850377Z 在 com.varian.acdp.flyway.executor.AcdpFlywayExecutor.clean(AcdpFlywayExecutor.java:75) ~[classes!/:2.0] 2024-02-27T14:12:10.5851227Z 在 com.varian.acdp.flyway.FlywayUtil.runFlyWay(FlywayUtil.java:30) ~[classes!/:2.0] 2024-02-27T14:12:10.5852058Z 在 com.varian.acdp.flyway.SnowflakeFlywayApp.run(SnowflakeFlywayApp.java:80) ~[classes!/:2.0] 2024-02-27T14:12:10.5853431Z 在 org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:769) ~[spring-boot-3.0.6.jar!/:3.0.6] 2024-02-27T14:12:10.5854151Z ... 13 更多 2024-02-27T14:12:10.5855061Z 引起:net.snowflake.client.jdbc.SnowflakeSQLException:SQL编译错误:
这看起来像雪花问题
SQL 编译错误:集成“
”不存在或未授权。
解决方案
建议的解决方案或解决方法是不使用存储集成来配置访问,而是为 S3 存储桶配置安全策略并为特定 IAM 用户配置访问凭证,以便以安全的方式访问外部阶段。
CREATE OR REPLACE STAGE s3_stage
URL='s3://mybucket/load/files/'
CREDENTIALS=(AWS_KEY_ID='1a2b3c' AWS_SECRET_KEY='4x5y6z')
ENCRYPTION=(TYPE='AWS_SSE_KMS' KMS_KEY_ID = 'aws/key');
CREATE OR REPLACE VIEW v1 (
first_name,
last_name,
email,
gender,
zip_code
) AS (
SELECT
$1,
$2,
$3,
$4,
$5
FROM @s3_stage/testfile.csv);
//使用函数提取视图“v1”中列的语义和隐私类别:
SELECT EXTRACT_SEMANTIC_CATEGORIES('v1', 10);
//使用存储过程将 EXTRACT_SEMANTIC_CATEGORIES 函数的结果应用为视图“v1”中的列上的标记:
CALL ASSOCIATE_SEMANTIC_CATEGORY_TAGS('v1',EXTRACT_SEMANTIC_CATEGORIES('v1',10));
在视图“v1”上使用 EXTRACT_SEMANTIC_CATEGORIES 函数或调用存储过程 ASSOCIATE_SEMANTIC_CATEGORY_TAGS 现在可以按预期工作。
另一种解决方法是使用外部表来使用外部存储位置中的数据,并在外部表上使用函数和存储过程以及在此外部表上创建的视图按预期工作:
CREATE OR REPLACE EXTERNAL TABLE et1
WITH LOCATION = @s3_stage/
REFRESH_ON_CREATE = TRUE
FILE_FORMAT = (TYPE = CSV);
CREATE OR REPLACE VIEW ext_v1
AS
SELECT * FROM et1;