DB2400删除列

DB2400删除列,db2,ibm-midrange,db2-400,Db2,Ibm Midrange,Db2 400,我想删除一个名为id的列,它是一个自动递增的主键 SQL: alter table "CO88GT"."XGLCTL" drop column id cascade; 我得到: Error: [SQL0952] Processing of the SQL statement ended. Reason code 10. SQLState: 57014 ErrorCode: -952 我可能错了,但我认为这与防止表丢失数据有关。为了解决这个问题,我需要创建一个没有列的新表,并将旧表中的

我想删除一个名为
id
的列,它是一个自动递增的主键

SQL:

alter table "CO88GT"."XGLCTL" drop column id cascade;
我得到:

Error: [SQL0952] Processing of the SQL statement ended.  Reason code 10.

SQLState:  57014

ErrorCode: -952

我可能错了,但我认为这与防止表丢失数据有关。为了解决这个问题,我需要创建一个没有列的新表,并将旧表中的数据复制到新表中,然后用新表替换旧表。

错误消息中没有足够的信息来确保,但是删除一个主键列通常是非常危险的,而且数据库的正确性使其变得很困难

您可能有一个涉及该列的外键约束

除非你确定自己知道自己在做什么,否则不要放弃约束并删除该列。

根据本文:

可以在绿屏环境中使用STRSQL删除列。我可以访问它,它确实可以工作,但是一个拥有400的客户端没有使用STRSQL的许可程序。问题是,如果这是我真正想做的事情,STRSQL将提示

为了获取数据,我正在使用带有JT400 JDBC驱动程序的SquirrelSQL客户端。。。所以我想,由于系统坚持提示(实际上,即使没有STRSQL,也无法获得提示),它不会让我这样做

所以我想我被困在做我正在做的事情。。。创建新表并复制数据,然后交换表。

Info AS400因可能丢失数据而向您发出警告(查询消息),要求您取消或忽略请求的操作。因此,由于这是一个交互式请求,通过JDBC/ODBC,您不能键入“I”来忽略,并抛出一个错误代码:-952和SQLState:57014以及原因代码10

文件中说:

如果您使用的是JDBC,并且SQL错误不是自解释的,那么可以使用参数“errors=full”建立JDBC连接,这将提供有关错误的更多信息。有关其他连接参数,请参见

连接字符串示例:

jdbc:as400://serverName;图书馆=*libl;命名=系统错误=全部

通过该连接,产生的错误如下所示:

Error: [SQL0952] Processing of the SQL statement ended.  Reason code 10.
Cause . . . . . :   The SQL operation was ended before normal completion.
The reason code is 10.
Reason codes and their meanings are:
1 -- An SQLCancel API request has been processed, for example from ODBC.
2 -- SQL processing was ended by sending an exception.
3 -- Abnormal termination.
4 -- Activation group termination.
5 -- Reclaim activation group or reclaim resources.
6 -- Process termination.
7 -- An EXIT function was called.
8 -- Unhandled exception.
9 -- A Long Jump was processed.
10 -- A cancel reply to an inquiry message was received.
11 -- Open Database File Exit Program (QIBM_QDB_OPEN).
0 -- Unknown cause.
Recovery  . . . :   If the reason code is 1, a client request was made to cancel SQL processing.  For all other reason codes, see previous messages to determine why SQL processing was ended.

SQLState:  57014
ErrorCode: -952

解决方案 最后,如果您不能使用STRSQL,另一个解决方案是使用iSeries Navigator,确切地说是它的“运行SQL脚本”(通常在这里-->%Program Files%\IBM\Client Access\Shared\cwbundbs.exe)

但首先,您必须添加一个系统回复参数(每台机器只添加一次)

ADDRPILE SEQNBR(1500)MSGID(CPA32B2)RPY('I')

这是在“绿色屏幕”中完成的。这将在CPA32B2查询消息上设置一个deafult应答('I')。CPA32B2是一个内部按摩id,与一个drop column操作相关联

(实际上不必在“绿色屏幕”中完成,就像CHGJOB命令一样使用它。例如:

cl:ADDRPYLE SEQNBR(1500)MSGID(CPA32B2)RPY('I')

)

现在您可以启动“运行SQL脚本”,要运行的第一个命令是:

cl:CHGJOB INQMSGRPY(*SYSRPYL)

这会将当前作业参数更改为*SYSRPYL*当显示查询消息时,SYSRPYL会导致查看是否存在系统回复参数

现在您可以运行alter来删除列


不幸的是,我不知道如何删除列,只使用JDBC。如果有人知道,请告诉我

参考资料:


我发现让jdbc工作的唯一方法是首先手动更改此消息的默认值。然后运行更新应用程序。在我们的例子中,我们使用液化酶。我可以让java的CommandCall调用ADDRPYLE和CHGJOB INQMSGRPY(*SYSRPYL),但它实际上从未允许alter table*drop column*不给出以下错误:

错误:

10 -- A cancel reply to an inquiry message was received.
工作指令:

CHGMSGD MSGID(CPA32B2) MSGF(QSYS/QCPFMSG) DFT('I')
参考:

绿色屏幕——STRSQL将为您提供错误消息以供回答

alter table devlibsc/trklst下拉列“ST”


更改文件TRKLST可能会导致数据丢失。(C I)

最后我找到了一个解决方案:

CALL QSYS2.QCMDEXC('ADDRPYLE SEQNBR(1500) MSGID(CPA32B2) RPY(''I'')');
CALL QSYS2.QCMDEXC('CHGJOB INQMSGRPY(*SYSRPYL)');


ALTER TABLE <tablename> DROP COLUMN <column_name>;                
调用QSYS2.qcmdex('ADDRPYLE SEQNBR(1500)MSGID(CPA32B2)RPY('I');
调用QSYS2.qcmdex('CHGJOB-INQMSGRPY(*SYSRPYL)');
改变表格下拉列;

我不明白为什么会阻止它,因为指定了级联。我只是在我设置的测试模式/库中混日子,所以它不是生产数据。“安全是好的,但当没有任何后果时,这只是令人讨厌的。@四元数-抱歉,没有看到瀑布。”。如果存在外键约束,那么确实应该为您删除它。所以我不知道真正的问题是什么,我建议将AS/400上的ODBC作业置于调试模式,以查看作业日志中是否显示任何内容。要查找ODBC作业,请使用WRKACTJOB作业(QZDASOINIT)并查找带有用户id的作业。请尝试STRSRVJOB作业(您的作业编号/用户/名称),然后尝试STRDBG UPDPROD(*是)。当作业处于调试模式时,运行SQL语句时会在作业日志中获得更多信息。我不确定,但您可能会从中得到一些有用的信息。谢谢您提供了这个详细且非常有用的答案。STRSQL不是必需的。一个非常简单的REXX过程可以接受ALTERTABLE DROP COLUMN语句,并像STRSQL一样以交互方式运行它。然后可以回答查询消息。与其更改消息描述的系统默认值,不如将MsgD复制到新的*MSGF并更改新的MsgD默认值。然后您可以在qmsgrpy(*DFT)中运行OVRMSGF-MSGF(QCPFMSG)、TOMSGF(newMsgF)和CHGJOB。这样,系统的版本将保持不变,只有具有覆盖的作业才会看到新的默认值。这也适用于JDBC/ODBC以及iSeries Navigator。您可以运行DLTOVR删除覆盖,并在删除列后运行CHGJOB将默认处理重置回其原始状态。要完成此操作,在命令行上使用I进行响应将忽略m
CALL QSYS2.QCMDEXC('ADDRPYLE SEQNBR(1500) MSGID(CPA32B2) RPY(''I'')');
CALL QSYS2.QCMDEXC('CHGJOB INQMSGRPY(*SYSRPYL)');


ALTER TABLE <tablename> DROP COLUMN <column_name>;