不能在过程 Netezza 中删除表跨数据库

Posted

技术标签:

【中文标题】不能在过程 Netezza 中删除表跨数据库【英文标题】:Can't Drop Table Cross Database in Procedure Netezza 【发布时间】:2014-11-25 07:10:23 【问题描述】:

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

    数据库“A” 数据库“B”

在数据库“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" 调用它(SP 在 DB"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;

它正在工作

我不明白为什么会这样,也许你有建议帮助我

谢谢

【问题讨论】:

【参考方案1】:

DBB 写入数据库或数据库目录的操作无法从 DBA 执行,这包括 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 中写入/删除的存储过程,但是在连接到 DBB 时必须调用 DBA 中的 SP。

例如:

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 中应该/不应该如何工作。

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

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

【讨论】:

好的。有时很容易混淆您在 Aginity 中连接到哪个数据库。如果您连接到 DBA,则不应在 DBB 中删除表。您可以在 Aginity 中 SQL 查询窗口上方的 DB 下拉列表中验证您连接到的数据库。 哇.. Sp 我不能使用来自 DB"A" 的 SP 删除 DB"B" 中的表,对吗?为什么会发生?谢谢 您可以使用来自 DBA 的 SP 来删除 DBB 中的表,但您必须在连接到 DBB 时从 DBA 调用 SP(即上面的示例)。原因是在 Netezza 中存在一个一般限制,即您无法更新未直接连接到的数据库。 但是,如果不使用 SP,为什么还要工作,我的意思是只运行查询。就像我的问题中的例子...... 你能贴一张它在 Aginity 中工作的完整截图吗?它不应该在 Aginity 中工作。

以上是关于不能在过程 Netezza 中删除表跨数据库的主要内容,如果未能解决你的问题,请参考以下文章

从 netezza 表中清除记录

Netezza 使用 JOIN 删除

从 Netezza 表中删除重复项

Netezza - 从 SQL 语句中获取已删除记录的计数

netezza 删除具有不同时间戳字段的记录,其中特定字段相同

无法从 Netezza 表中删除重复数据