【发布时间】:2022-11-19 13:07:13
【问题描述】:
我需要将克隆后雪花程序的所有权转移到新角色。
为此,我使用了一个处理 database.information_schema.xxxx 视图中所有对象的过程。
虽然过程有问题,SHOW PROCEDURE 有一列将过程签名显示为参数类型,但 information_schema.procedures 视图显示实际参数名称及其参数类型,如果传递给 GRANT 命令则不起作用- 授予仅需要参数类型签名,而不是参数名称:/
显示过程参数 => PROCEDURE_NAME(VARCHAR) 返回 VARCHAR INFORMATION_SCHEMA.PROCEDURES.ARGUMENT_SIGNATURE => PROCEDURE_NAME(P_PARAM1 VARCHAR)
我最终想出了这个很有趣,但感觉相当复杂的问题是 - 我错过了一个更简单的方法吗?
SELECT procedure_name
, concat('(',listagg(argtype, '') within group (order by argindex)) cleanArgTypes
FROM (SELECT procedure_name
, argument_signature
, lf.index argindex
, lf.value argtype
FROM rock_dev_test_1.information_schema.procedures
, lateral flatten(input=>split(decode(argument_signature
,'()','( )'
,argument_signature
),' ')
,outer=>true) lf
WHERE lf.index/2 != round(lf.index/2)
)
GROUP BY procedure_name
, argument_signature
ORDER by 1,2;
cleanArgTypes => (VARCHAR)
这将过度特定的 argument_signature 使用空格作为分隔符将其拆分为一个数组,然后将返回集横向展平为行,丢弃参数名称(始终在偶数索引处),然后按参数名称和签名分组并使用 ListAgg 放置参数参数类型变回字符串。
那个()中的小皱纹不起作用,所以必须转移到()
虽然我喜欢涉足 Snowflakes 的一些半结构化功能,如果有更简单的方法,我宁愿使用它!
【问题讨论】:
-
抱歉,我没有足够的声誉来支持答案,希望另一位读者会……感谢您的输入,总是很高兴看到替代方法,特别是如果它提供更紧凑、更整洁或更高效的代码。一位同事使用带有 RegExp 的 UDF 来解决这个问题,并且由于我需要将它重用于函数,这就是 atm 采用的方法。
标签: stored-procedures snowflake-cloud-data-platform