如何为编程创建的SASLibrary元数据添加扩展属性
解答
三个问题统一给结论:所有操作都可以通过PROC METADATA编程实现,完全能支撑你批量建库的需求,不需要手动在MC界面点配置。
各配置项的实现方式
你之前的代码只创建了独立的SASLibrary元数据对象,缺失的项一部分是对象本身的未配置属性,另一部分是和其他元数据对象的关联关系,具体赋值规则如下:
- 存储位置(元数据文件夹):你代码里写的
Folder属性不是SAS元数据的标准属性,不生效。正确的绑定方式是在SASLibrary节点下新增<Trees>子节点,通过ObjRef关联目标文件夹的元数据ID。文件夹路径和ID的映射可以提前通过PROC METADATA一次性查全存成映射表,批量建的时候直接取就行。 - Schema名称:是SASLibrary对象的原生属性,直接在SASLibrary标签上加
Schema="你的数据库Schema名"即可,注意大小写和数据库端保持一致,不然连接会报错。 - 资源模板/访问模板:这类配置不是SASLibrary的单值属性,是和Prototype类型元数据对象的关联:
- 给SASLibrary标签加
Prototype="模板的元数据ID"属性,同时新增<UsedByPrototypes>子节点绑定同一个模板ID,就可以完成库和资源模板的关联 - 如果要更新访问模板本身,直接对Prototype类型的元数据对象执行UpdateMetadata操作即可,模板里的连接参数、驱动配置、默认Schema、认证域关联所有项都支持修改,没有限制。
- 给SASLibrary标签加
另外你之前代码里的Flags参数建议调整为268435456 1024,追加的1024标记是开启关联对象递归处理,避免因为关联对象校验不通过创建失败。
修正后的建库示例代码
proc metadata in='<AddMetadata> <Metadata> <SASLibrary Name="Test Library" Desc="This is a test" Engine="DB2" IsDBMSLibname="1" IsHidden="0" Libref="testlib" IsPreassigned="0" PublicType="Library" Schema="YOUR_TARGET_SCHEMA" Prototype="A0000001.XXXXXX"> /* 替换为实际使用的资源模板元数据ID */ <Trees> <Tree ObjRef="A0000001.YYYYYY"/> /* 替换为目标元数据文件夹\Shared Data\Test的ID */ </Trees> <UsedByPrototypes> <Prototype ObjRef="A0000001.XXXXXX"/> /* 和上面Prototype属性的ID保持一致 */ </UsedByPrototypes> </SASLibrary> </Metadata> <Reposid>A0000001.A849HGWS</Reposid> <NS>SAS</NS> <Flags>268435456 1024</Flags> <Options/> </AddMetadata> '; run;
访问模板更新示例
如果需要批量修改已有访问模板配置,用UpdateMetadata方法操作Prototype对象即可,示例片段:
proc metadata in='<UpdateMetadata> <Metadata> <Prototype Id="A0000001.XXXXXX" /* 替换为要更新的模板ID */ Name="New Template Name" Desc="Updated template for DB2 connection"> /* 可按需新增子节点修改连接配置、认证域、驱动参数等内容 */ </Prototype> </Metadata> <Reposid>A0000001.A849HGWS</Reposid> <NS>SAS</NS> <Flags>268435456</Flags> <Options/> </UpdateMetadata> '; run;
批量操作前建议先在测试环境验证单个库的创建逻辑,确认属性、关联ID都正确后再批量跑,避免生成冗余的元数据垃圾。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

