更改我的工作创建的每个数据集的所有者和权限

Change owner and permissions of every dataset created by my job

我需要更改我的作业生成的每个数据集的所有者和权限。我需要将其包含在我的 post 处理过程中。我可以在我的 SAS 代码中使用 X 或管道使用 chown 命令来更改最新创建的数据集的权限。建议获取作业中创建的所有永久数据集列表的方法。

当你说"permanent datasets"时,你一定是指那些数据集存储在一个或多个地方。为什么不直接使用 filename test pipe "dir /b/s X:\xxxxxx\*.sas7dbat" 来获取列表?

没有 SAS on/off 选项 'journaling' 功能可以自动识别创建数据集的 runner/job。安装在大型机(大型机)操作系统中的 SAS,或者可能是 OpenVMS,可能会由 OS.

自动完成

您知道创建新数据集时使用的库名称 <path> 吗?

一种方法依赖于 find 选项 -newer

-newer file
File was modified more recently than file. If file is a symbolic link and the -H option or the -L option is in effect, the modification time of the file it points to is always used.

所以你想

  • 作业开始 - 创建标记文件
  • 作业结束-找到比标记文件更新的文件并对它们执行chown命令

示例:

libname joblib '~/myjobs/sasdata';

* create marker file;
%sysexec touch /tmp/job-start.tag

* sas code;

* chown and chmod each newer file;
%sysexec find ~/myjobs/sasdata -type f -newer /tmp/job-start.tag -exec chmod 755 {} \%str(;);
%sysexec find ~/myjobs/sasdata -type f -newer /tmp/job-start.tag -exec chown newower {} \%str(;);

从作业中标记 SAS 数据集的替代方法

这个想法是以一种将数据集与其他作业区分开来的方式来分离、标记或标记数据集

方式一.作业创建独立的数据集集:

为每个 运行 创建一个新的作业专用文件夹:

  • 在源代码中使用通用的库引用,例如 JOB,但让它指向新文件夹
  • 运行 作业,创建新数据集。
  • 执行 post-作业调整
  • 将新数据集移动到PERM,它们的永久存储位置

方式 2.作业来源依赖于 PERM 中的数据集,无法更改:

使用库路径串联:

  • 在作业启动之前更改 libname
    libname PERM ("<path-to-new-job-unique-folder">, "<path to actual PERM>");
  • 新数据集将在串联的第一条路径中创建。
  • Post-工作流程数据集如前所述

方式3.使用宏变量来标记作业中的每个数据集


  • 更改职位代码 DATA xyz; …

    %let JOB_TIMESTAMP=%sysfunc(datetime()); %* this is a job 'tag' for job-unique identification; %let JOB_LABEL=(label="JOBID:&JOB_LABEL"); DATA xyz &JOB_LABEL; …
  • Post作业,使用PROC CONTENTS或SQLDICTIONARY.TABLES确定标签中有&JOB_TIMESTAMP的数据集。

方式 4。SAS 服务器上的作业 运行,标签无法更改

  • 更新 JOB 源代码,以便作业创建的每个数据集都创建一个相应的元数据注释,其中包含 &JOB_TIMESTAMP.
  • Post 作业,扫描 &JOB_TIMESTAMP 的元数据注释并调整匹配的那些。

方式 5.为作业创建的每个数据集创建 AUDIT 数据集

  • 搜索 "Understanding an Audit Trail"
  • 的帮助
  • Post 职位搜索审核 table 职位标签

其他方式

  • 为工作创建您自己的跟踪table
  • 作业源必须改变,宏可以帮助加强一致性: %macro jobtracker(data=, id=); … insert into perm.jobtracker values ("&data", "&id") … %mend; … %jobtracker(data=analysis1, id=&JOB_TIMESTAMP) %* manually track each table; data analysis1; …
  • Post 作业,处理每个 PERM.JOBTRACKER&JOB_TIMESTAMP 的数据集。

如果以上方法不适合您,请在问题中添加更多信息:

  • 职位是如何启动的?
  • 从时间上看,起点有多近?
  • 运行并行有多少作业?
  • 工作是否会在创建或依赖新数据集时发生冲突?
  • 您是否完全控制应用的源代码和数据集选项?