Domanda

Voglio eliminare una colonna chiamata id che è un incremento PK automatico.

Lo SQL:

alter table "CO88GT"."XGLCTL" drop column id cascade;

E ho:

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

SQLState:  57014

ErrorCode: -952

potrei sbagliarmi, ma penso che abbia qualcosa a che fare con la prevenzione del tavolo dalla perdita di dati. Per ovviare a questo problema ho bisogno di creare una nuova tabella senza la colonna e copiare i dati dal vecchio tavolo nella nuova tabella e quindi sostituire il vecchio tavolo con la nuova tabella.

È stato utile?

Soluzione

Informazioni

AS400 ti dà un avvertimento (messaggio di richiesta) a causa di una possibile perdita di dati, che chiede di annullare o ignorare l'operazione richiesta. Così, in causa di questo essere una richiesta interattivo, oltre JDBC / ODBC non è possibile digitare 'I' di ignorare, e come si getta un CodiceErrore: -952 con SQLState:. 57014 e ragione codice 10

Nella documentazione di SQL0952 dice:

Message Text:   Processing of the SQL statement ended. Reason code &1.
Cause Text:     The SQL operation was ended before normal completion. The reason code is &1. 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.

Se si sta utilizzando JDBC e l'errore di SQL non è auto-esplicativo, è possibile effettuare una connessione JDBC con il parametro ' errori = completa ', che darà molto più informazioni sull'errore. Per gli altri parametri di connessione vedere questo .

stringa di esempio di collegamento:

jdbc: AS400: // serverName; biblioteche = * LIBL; denominazione = sistema; errori = completa ;

Con questo collegamento l'errore risultante sarebbe simile a questo:

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

La soluzione

Così alla fine, se non è possibile utilizzare STRSQL, un'altra soluzione è quella di utilizzare iSeries Navigator, per l'esattezza i suoi "script Esegui SQL" (di solito è qui -> "% Programmi% \ IBM \ Client Access \ Shared \ cwbundbs.exe «).

Ma prima di tutto è necessario aggiungere un parametro di risposta del sistema ( solo una volta per macchina )

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

Questo viene fatto in "green screen". Questo imposta una risposta deafult ( 'I') sul messaggio di richiesta CPA32B2. Il CPA32B2 è un id massaggio interno, che è legato a un'operazione colonna goccia.

(In realtà non deve essere fatto in "green screen", usarlo come il comando CHGJOB. Esempio:

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

)

Ora si può iniziare a "script Esegui SQL", il primo comando da eseguire è:

cl: CHGJOB INQMSGRPY (* SYSRPYL);

questo cambia il lavoro corrente parametro INQMSGRPY , a * SYSRPYL. * SYSRPYL induce a cercare se esiste un parametro di risposta del sistema quando dovrebbe essere visualizzato un messaggio di richiesta.

Ora è possibile eseguire il vostro alter che scende la colonna.


Purtroppo, non so come far cadere una colonna, usando solo JDBC. Se qualcuno sa per favore fatemelo sapere.

References:

Altri suggerimenti

Finalmente ho trovato una soluzione:

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


ALTER TABLE <tablename> DROP COLUMN <column_name>;                

Non ci non è abbastanza informazioni nel tuo messaggio di errore per essere sicuri, ma lasciando cadere una colonna chiave primaria è generalmente abbastanza rischioso e il database rende correttamente difficile.

È probabile che hanno un vincolo di chiave esterna che coinvolge quella colonna.

Non far cadere il vincolo e cancellare quella colonna se non sei sicuro di sapere cosa si sta facendo.

Secondo questo post: http://bytes.com/topic / DB2 / risposte / 185467-drop-colonna-table

E 'possibile eliminare una colonna utilizzando STRSQL nell'ambiente schermo verde. Ho avere accesso a questo e lo fa lavorare, ma un cliente con una 400 non ha il programma su licenza da utilizzare STRSQL. Il problema è che STRSQL verrà chiesto se questo è qualcosa che voglio veramente fare.

Per ottenere i dati che sto usando cliente SQuirrel SQL con il driver JDBC jt400 ... Quindi credo che con il sistema di insistere su suggerimento (e in realtà non c'è modo di ottenere la rapida senza nemmeno STRSQL) sarà non lasciare fare a me.

Quindi credo che mi sono bloccato a fare quello che sto facendo ... la creazione di una nuova tabella e copiare i dati e poi scambiando le tabelle.

L'unico modo che ho trovato per ottenere JDBC per il lavoro è quello di cambiare prima manualmente il valore predefinito per questo messaggio. Quindi eseguire l'applicazione di aggiornamento. Nel nostro caso usiamo Liquibase. Ho potuto ottenere CommandCall del Java di chiamare ADDRPYLE e CHGJOB INQMSGRPY (* SYSRPYL), ma non è mai in realtà permesso al tavolo alter * colonna drop * per non dare l'errore seguente:

Errore:

10 -- A cancel reply to an inquiry message was received.

Comando di funzionamento:

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

Riferimento:

green screen - STRSQL vi darà errore msg di risposta

Tavolo alter devlibsc / trklst colonna goccia "ST"

Cambio di file di TRKLST può causare perdita di dati. (C I)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top