1

我正在尝试使用 SAS 加载表、创建索引、收集统计信息、授予对 teradata 表的选择权限以完成工作。SAS 是我必须选择的唯一软件。

以下脚本成功删除表、加载表、创建索引但不收集统计信息或授予选择。有没有另一种方法可以做到这一点,还是我做错了?

libname ias teradata server=<server> USER=&tduser. schema=<dbname> password=&tdpass.;

proc datasets library=ias;
   delete <tablename>;
run;

data ias.<tablename> (bulkload=yes sleep=10 tenacity=4 dbcommit=80000);
  set WORK.<data set name>;
run;

proc sql;
    connect to teradata as td (user=&tduser.  password=&tdpass. tdpid="<server>" schema="<dbname>");
    execute(create index <indexname> (<columnname>) on <dbname>.<tablename>) by td;
    execute(commit) by td;
    execute(collect statistics on <dbname>.<tablename> index (<columnname>);
    execute(commit) by td;
    execute(grant select on <dbname>.<tablename> to <list of users>) by td;
    execute(commit) by td;
disconnect from td;
run;
4

1 回答 1

0

在我看来一切都很好。你怎么知道 COLLECT 和 GRANT 命令不起作用?你收到错误信息了吗?

几点注意事项:

在您的 PROC SQL CONNECT 语句中,我建议您添加选项 MODE=TERADATA; 这会将连接置于“Teradata”而不是“ANSI”模式,其中一个好处是命令会自动“提交”;您不需要那些“提交”步骤。

同样在您的 PROC SQL CONNECT 语句中,您指定了 SCHEMA 选项;我不认为这有任何影响。EXECUTE 块中的所有内容都必须是纯 Teradata 语法,因此完全限定所有表引用。

确保您的 COLLECT STATISTICS 语句位于“index ()”而不是“index()”上。

最后,我强烈建议您在创建表时使用 DBCREATE_TABLE_OPTS 和 DBTYPE 数据集选项显式定义表的主索引和数据类型,例如:

data ias.<tablename>
     (bulkload-yes sleep=10 tenacity=4
      dbcreate_table_opts='primary index(<columnname>)'
      dbtype=(  <columnname>='<teradata column definiton>'
              , <anothercolumn>='<teradata column definition>'
             ));
       set WORK.<data set name>;
run;

如果您没有明确命名索引,则将为索引选择 SAS 数据集中的第一个变量(可能正确也可能不正确),并且数据类型可能不合适。

如果您仍然有问题,请发回任何错误消息;并且请使用一个确切的例子(不要用括号引用隐藏列名和表名)。

于 2012-06-19T15:07:29.077 回答