不能在过程 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 中删除表跨数据库的主要内容,如果未能解决你的问题,请参考以下文章