2016-04-26 45 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放入視圖中將無法工作。