2016-04-26 44 views
2

我正在尝试在SAS隐式SQL中使用Teradata UDF(用户定义的函数),该函数使用LIBNAME Statement建立与Teradata的连接。假设函数名为PTY_DECRYPT,并且在Teradata中名为TEST的数据库中定义。此功能的目的是解密Teradata中的视图列中的值。在SAS中使用Teradata UDF隐式Sql通过

在显式Sql中使用UDF有什么作用。下面我在名为SAMPLE的数据库中存在的称为V_TEST_PERS的视图中使用名为SSN_NBR的列上的函数。

Explcit 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,但它不工作。有关如何使Implicit Sql在隐式Sql中工作并对Implicit 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; 

回答

1

在您的暗示SQL你引用视图与LIBNAME别名TD,但是当你引用UDF你不走样包含UDF与LIBNAME别名TEST数据库。在句法上,您可能无法在SAS中执行此操作。 (如TD.TEST.PTY_DECRYPT() - 其实我不希望这个工作)

的UDF可能需要放置在SYSLIBTD_SYSFNLIB,使其在数据库优化器默认搜索路径找到UDF还没有完全合格。 (例如TD_WEEK_BEGIN())或者,可以将UDF放置在数据库SAMPLE中,但这可能会违反如何在您的环境中维护UDF,就像在我的环境中那样。

否则,可以将UDF调用嵌入到数据库的视图中,但是如果您的环境没有将列级别的安全性授予包含加密数据的视图,那么您还需要考虑其他问题以及该列的安全性元素。 (例如PHI,PII等)如果没有行列级安全机制来动态地过滤用户在视图中查看要解密的列的能力,那么将UDF放入视图中将无法工作。