如何在SAS Proc SQL中创建只读的ODBC直通连接?
解决方案
可以通过以下三种方式实现PROC SQL ODBC直通连接的只读限制:
方案1:复用只读LIBNAME连接(最推荐)
SAS支持CONNECT TO USING语法直接关联已定义的逻辑库,会完整继承逻辑库的ACCESS=READONLY权限限制,无需重复写连接参数,是官方支持的最稳妥方案。
示例代码:
/* 定义带只读属性的ODBC逻辑库 */ LIBNAME myLib ODBC NOPROMPT="DATABASE=myDB;Server=myServer;DRIVER={SQL Server};Trusted_Connection=Yes;" ACCESS=READONLY; PROC SQL; /* 直接关联已有逻辑库创建连接,自动继承只读权限 */ CONNECT TO USING myLib AS myCon; /* 此时执行任何写入操作都会被SAS直接拦截报错 */ EXECUTE( INSERT INTO myTable(myColumn) VALUES(1) ) BY myCon; QUIT;
方案2:数据库层面开启只读事务
连接建立后先执行对应数据库的只读事务开启语句,后续所有操作都会被数据库限制为只读,就算账号有写入权限也无法执行写操作。不同数据库的开启语句略有差异:
- SQL Server/Oracle:
SET TRANSACTION READ ONLY - MySQL:
SET SESSION TRANSACTION READ ONLY
示例代码(SQL Server环境):
PROC SQL ; CONNECT TO ODBC AS myCon(NOPROMPT="DATABASE=myDB;Server=myServer;DRIVER={SQL Server};Trusted_Connection=Yes;") ; /* 连接后立刻开启只读事务 */ EXECUTE( SET TRANSACTION READ ONLY ) BY myCon; /* 写入操作会被数据库拒绝报错 */ EXECUTE( INSERT INTO myTable(myColumn) VALUES(1) ) BY myCon ; QUIT;
方案3:宏层面做SQL关键字校验
在你的SAS宏中增加逻辑,对用户传入的待执行直通SQL做关键字校验,检测到INSERT/UPDATE/DELETE/DROP/ALTER等写操作关键字时直接终止执行,作为兜底校验层。
示例宏代码片段:
%macro run_readonly_odbc_sql(run_sql=, db_con_str=); /* 先做写操作关键字校验,不区分大小写 */ %if %sysfunc(prxmatch(/\b(INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|TRUNCATE|GRANT|REVOKE)\b/i, &run_sql)) %then %do; %put ERROR: 当前为只读连接,不允许执行包含写操作的SQL语句,已终止运行; %return; %end; /* 校验通过后执行SQL */ PROC SQL; CONNECT TO ODBC AS myCon(NOPROMPT=&db_con_str); EXECUTE( &run_sql ) BY myCon; QUIT; %mend;
注意:该方案仅作为兜底补充,存在被特殊注释、变种写法绕过的可能,建议和前两种方案搭配使用。
内容的提问来源于stack exchange,提问作者user3799203
相关产品推荐
相关产品推荐

