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。如果有人知道,请告诉我 参考资料:
10 -- A cancel reply to an inquiry message was received.
工作指令:
CHGMSGD MSGID(CPA32B2) MSGF(QSYS/QCPFMSG) DFT('I')
参考:
更改文件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>;