无法在过程Netezza中删除表交叉数据库

时间:2014-11-25 07:10:23

标签: sql stored-procedures netezza

我netezza的新手(运行版本netezza版本7.1.0.1-P1 [Build 37788]),我有2个数据库:

  1. DB" A"
  2. DB" B"
  3. 在DB" A"我有程序SP_DROP_TMP_TABLE_DBB()

    create or replace procedure SP_DROP_TMP_TABLE_DBB()
    LANGUAGE NZPLSQL RETURNS INT4 AS
    BEGIN_PROC
    
    DECLARE
    
    BEGIN   
    
        /* HAPUS TABLE HASIL CLUSTERING */
        EXECUTE IMMEDIATE '
            DROP TABLE DBB.USR3.STG_AP_LOC_KMEANS_OUT;
        ';
    
        /* HAPUS ALL_NMS_DETAIL */
        EXECUTE IMMEDIATE '
            DROP TABLE DBB.USR3.ALL_DETAIL;
        ';
    
    END;
    
    END_PROC;
    

    SP_DROP_TMP_TABLE_DBB()用于删除DB" B"中的所有TMP表,但我需要从DB" A"(在DB DB中创建的SP" A")中调用它

    但是当我打电话给DB" A"

    CALL SP_DROP_TMP_TABLE_DBB()
    

    结果是:

    ERROR:  Cross Database Access not supported for this type of command
    

    然而,当我在DB" A" :

    DROP TABLE DBB.USR3.STG_AP_LOC_KMEANS_OUT;
    

    它在工作

    我不明白为什么会发生这种情况,也许你有建议帮助我

    THX

1 个答案:

答案 0 :(得分:1)

无法从 DBA 执行写入 DBB 的数据库或数据库目录的操作,这包括DROP TABLE。

运行此命令并成功时:

DROP TABLE DBB.USR3.STG_AP_LOC_KMEANS_OUT;

然后我必须相信你不能被附加到 DBA

您是否正在运行来自Aginity,NZSQL或其他工具的测试命令?

以下是系统的行为方式。

[nz@netezza ~]$ nzsql -d dba
Welcome to nzsql, the IBM Netezza SQL interactive terminal.

Type:  \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

DBA.ADMIN(ADMIN)=> drop table dbb.admin.STG_AP_LOC_KMEANS_OUT;
ERROR:  Cross Database Access not supported for this type of command
DBA.ADMIN(ADMIN)=> \c dbb
You are now connected to database dbb.
DBB.ADMIN(ADMIN)=> drop table dbb.admin.STG_AP_LOC_KMEANS_OUT;
DROP TABLE

关于存储过程,需要注意的另一点是,您可以在DBA中定义一个写入/删除DBB的存储过程,但DBA中的SP必须在连接到DBB时被调用。

例如:

DBA.ADMIN(ADMIN)=> create or replace procedure SP_DROP_TMP_TABLE_DBB()
DBA.ADMIN(ADMIN)-> LANGUAGE NZPLSQL RETURNS INT4 AS
DBA.ADMIN(ADMIN)-> BEGIN_PROC
DBA.ADMIN(ADMIN)$>
DBA.ADMIN(ADMIN)$> DECLARE
DBA.ADMIN(ADMIN)$>
DBA.ADMIN(ADMIN)$> BEGIN
DBA.ADMIN(ADMIN)$>
DBA.ADMIN(ADMIN)$>     /* HAPUS TABLE HASIL CLUSTERING */
DBA.ADMIN(ADMIN)$>     EXECUTE IMMEDIATE '
DBA.ADMIN(ADMIN)$>         DROP TABLE DBB.ADMIN.STG_AP_LOC_KMEANS_OUT;
DBA.ADMIN(ADMIN)$>     ';
DBA.ADMIN(ADMIN)$>
DBA.ADMIN(ADMIN)$>     /* HAPUS ALL_NMS_DETAIL */
DBA.ADMIN(ADMIN)$>     EXECUTE IMMEDIATE '
DBA.ADMIN(ADMIN)$>         DROP TABLE DBB.ADMIN.ALL_DETAIL;
DBA.ADMIN(ADMIN)$>     ';
DBA.ADMIN(ADMIN)$>
DBA.ADMIN(ADMIN)$> END;
DBA.ADMIN(ADMIN)$>
DBA.ADMIN(ADMIN)$> END_PROC;
CREATE PROCEDURE
DBA.ADMIN(ADMIN)=> \c dbb
You are now connected to database dbb.
DBB.ADMIN(ADMIN)=> call dba.admin.SP_DROP_TMP_TABLE_DBB();
 SP_DROP_TMP_TABLE_DBB
-----------------------

(1 row)

以下是一些关于它应该/不应该在Aginity中工作的示例截图。

以下是预期的跨数据库访问错误的图像。

enter image description here

这是连接到相应数据库的成功运行的图像。

enter image description here