是否有可能看到哪个程序创建了一个表和/或最后修改过它?

时间:2018-01-04 16:09:54

标签: sas metadata

我正在使用SAS EG并正在查看我在库中保存的一些表。我需要知道某张桌子的来源,但我找不到任何类似的元信息,例如哪个SAS程序创建它或最后修改它。如果有人知道某种方式,那将非常感激。

3 个答案:

答案 0 :(得分:1)

简答:没有 不存储关于哪个“程序”创建或修改表的元信息。甚至“程序”的概念也与您相关,但对SAS来说并不多。您的SAS服务器是发送它执行的代码,它对SAS程序的名称或代表来自的EG项目的关注很少。

假设您的SAS环境存储工作区服务器日志,您最好的希望是通过这些查找提交代码中某个表的引用。使用包含的时间戳,用户ID和打印代码,您应该找到所需的所有信息,但这将是一个费力的过程。

答案 1 :(得分:1)

不,没有直接的方法来查看特定程序修改了数据集。 SAS跟踪发送到处理器的指令;只是在最近才能在窗口中同时打开多个程序。

然而,您可以在数据集创建和上次修改时告诉,这可能会为您提供所需的信息(特别是在您运行程序时进行记录)。

如果需要,您还可以使用程序中的数据集标签将程序名称添加到数据集中 - 但您必须主动执行此操作。

data want(label='myprogram.sas');
  set sashelp.class;
run;

根据您的运行方式(Batch,DM SAS,EG,Studio,SAS CONNECT等),可能会有一个宏变量,其中包含您可以在所有程序中添加的程序名称,以使其自动生成。 / p>

例如,在指定EG时,有一组可能有用的全局宏变量:

GLOBAL _CLIENTMACHINE '[machinename]'
GLOBAL _CLIENTPROCESSFLOWNAME 'Process Flow'
GLOBAL _CLIENTPROJECTNAME ''
GLOBAL _CLIENTPROJECTPATH ''
GLOBAL _CLIENTPROJECTPATHHOST ''

但是,这只是向前发展,这不是已经写入数据集的内容,因此无法帮助您确定过去发生的事情。

答案 2 :(得分:0)

我同意其他答案到目前为止不,我知道没有关于元数据中创建程序的记录或类似的东西。如果有的话,我不知道我有多依赖它,因为我和我的同事经常使用%include从外部文件中获取资源 - 采购或源程序是否会得到上市?

无论如何,我之前遇到的情况与你的情况类似,而且在追踪创建神秘数据集的程序时实际工作的一件事是使用文件管道搜索我们的网络驱动器上的所有程序.sas可用于创建该表的任何公共语句的扩展名(例如" data libname.datasetname;")。

信用到期的信用:以下大部分代码均来自Brian Varney的白皮书。我希望我记得更多具体细节。

filename pipedir pipe ' dir "<ENTER THE TARGET DIRECTORY TO SEARCH HERE>" /S' lrecl=5000;

data indata;
infile pipedir truncover;
input line $char1000.;
length directory $1000;
retain directory;
if line =' ' or
index(upcase(line),'<DIR>') or
left(upcase(line))=:'VOLUME' then
delete;
if left(upcase(line))=:'DIRECTORY OF' then
directory=left(substr(line,index(upcase(line),'DIRECTORY OF')+12));
if left(upcase(line))=:'DIRECTORY OF' then
delete;
if input(substr(line,1,10),?? mmddyy10.) = . then
substr(line,1,10)='12/31/2999';
date=input(substr(line,1,10),?? mmddyy10.);
format date mmddyy10.;
run;
proc sort data=indata;
by directory descending date;
run;

data Directory_Summary(drop=i line);
set indata;
by directory;
length filename $75;
retain number_of_files_in_directory directory_size;
if first.directory then
do;
number_of_files_in_directory=input(scan(line,2,' '),32.);
directory_size=input(scan(line,4,' '),comma32.);
end;
file_size=input(scan(line,4,' '),comma32.);
filename=' ';
do i=5 to 100;
filename=trim(left(filename))||' '||scan(line,i,' ');
if scan(line,i,' ')=' ' then
leave;
end;
if index(upcase(line),'FILE(S)') then
delete;
if date ge '30DEC2999'd then
delete;
run;

proc sql noprint;
select distinct directory into :dir1 - :dir9999
from directory_summary
where scan(lowcase(filename),-1,'.')='sas';
quit;
%let numdirs=&sqlobs.;
%put &numdirs.;
proc datasets nolist lib=work;
delete allprgs;
quit;

%macro getsasprgs;
%do i=1 %to &numdirs.;
data prgs;
length line sasprogram f $300;
infile "&&dir&i.\*.sas" FILENAME=f;
input;
sasprogram =f ;
linenum+1;
if lag(sasprogram) ne sasprogram then linenum=1;
line=_infile_;
run;
proc append base=allprgs data=prgs;
run;
%end;
%mend getsasprgs;
%getsasprgs;

proc sql;
select *
from allprgs
where lowcase(line) ? "<ENTER THE LINE OF CODE YOU WANT TO FIND HERE>";
quit;
祝你好运。