[英]Using a Teradata UDF in SAS Implicit Sql Pass Thru
我正在尝试在 SAS 隐式 SQL 中使用 Teradata UDF(用户定义函数),该 SQL 使用 LIBNAME 语句建立与 Teradata 的连接。假设该函数称为 PTY_DECRYPT,并在 Teradata 中名为 TEST 的数据库中定义。 此函数的目的是解密 Teradata 中视图列中的值。
有效的是在显式 Sql 中使用 UDF。下面我在名为 SSN_NBR 的列上使用该函数,该函数位于名为 SAMPLE 的数据库中的名为 V_TEST_PERS 的视图中。
显式 Sql:
Options debug=DBMS_TIMERS sastrace=',,,d'
sastraceloc=saslog no$stsuffix fullstimer;
Proc Sql;
Connect to TERADATA(User=XXXXX pwd=XXXXX server=XXXXX);
Create Table Final as
select * from connection to teradata
(
Select
sub_id,
SSN_NBR,
TEST.PTY_DECRYPT(SSN_NBR,'T_ssn_test',400,0,0 ) as SSN_NBR_Decrypt
from SAMPLE.V_TEST_PERS
);
disconnect from teradata;
Quit;
但我想在隐式 SQL 中使用相同的函数,但它不起作用。 关于如何在对隐式 SQL 进行最少更改的情况下使其在隐式 Sql 中工作的任何想法?
隐式 SQL
Options debug=DBMS_TIMERS sastrace=',,,d'
sastraceloc=saslog no$stsuffix fullstimer;
Libname Td Teradata User=XXXXX pwd=XXXXX server=XXXXX database=SAMPLE ;
Proc sql;
Create table Final as
select
sub_id,
SSN_NBR,
TEST.PTY_DECRYPT(SSN_NBR,'T_ssn_test',400,0,0 ) as SSN_NBR_Decrypt
from Td.V_TEST_PERS;
Quit;
在您的隐式 SQL 中,您使用 LIBNAME 别名TD
引用视图,但是当您引用 UDF 时,您不会使用 LIBNAME 别名为包含 UDF 的TEST
数据库设置别名。 从语法上讲,您可能无法在 SAS 中做到这一点。 (例如TD.TEST.PTY_DECRYPT()
- 事实上我不希望这能工作)
该UDF可能需要放置在SYSLIB
或TD_SYSFNLIB
,使其在数据库优化器默认搜索路径找到UDF还没有完全合格。 (例如TD_WEEK_BEGIN()
)或者,UDF 可以放置在数据库SAMPLE
但这可能违反了 UDF 在您的环境中的维护方式,就像在我的环境中一样。
否则,UDF 调用可能会嵌入到数据库的视图中,但是如果您的环境没有在列级别基础上向包含加密数据元素的视图授予安全性,那么您还有其他问题需要考虑该列的安全性。 (例如 PHI、PII 等)如果没有行列级安全机制来动态过滤用户在视图中查看您正在解密的列的能力,则将 UDF 放入视图中是行不通的。
我在 SAS 社区论坛上问了同样的问题,我很高兴地说我确实找到了这个问题的解决方案。
请参阅以下链接:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.