在 SAS 中使用 Teradata UDF 隐式 Sql 直通
Using a Teradata UDF in SAS Implicit Sql Pass Thru
我正在尝试在 SAS 隐式 SQL 中使用 Teradata UDF(用户定义函数),它使用 LIBNAME Statement.Assume 建立与 Teradata 的连接,该函数被调用 PTY_DECRYPT并在 Teradata 中称为 TEST 的数据库中定义。此函数的目的是解密 Teradata 中视图的列中的值。
有效的是在显式 Sql 中使用 UDF。下面我在名为 SAMPLE 的数据库中存在的名为 V_TEST_PERS 的视图中使用名为 SSN_NBR 的列上的函数.
显式 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 社区论坛上问了同样的问题,我很高兴地说我确实找到了解决这个问题的方法。
请参阅下面的 link :
我正在尝试在 SAS 隐式 SQL 中使用 Teradata UDF(用户定义函数),它使用 LIBNAME Statement.Assume 建立与 Teradata 的连接,该函数被调用 PTY_DECRYPT并在 Teradata 中称为 TEST 的数据库中定义。此函数的目的是解密 Teradata 中视图的列中的值。
有效的是在显式 Sql 中使用 UDF。下面我在名为 SAMPLE 的数据库中存在的名为 V_TEST_PERS 的视图中使用名为 SSN_NBR 的列上的函数.
显式 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 社区论坛上问了同样的问题,我很高兴地说我确实找到了解决这个问题的方法。
请参阅下面的 link :