Question

Je veux déposer une colonne appelée id qui est une incrémenter auto PK.

Le SQL:

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

Et je reçois:

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

SQLState:  57014

ErrorCode: -952

Je peux me tromper mais je pense qu'il a quelque chose à voir avec la prévention de la table de perdre des données. Pour contourner ce problème, je dois créer une nouvelle table sans la colonne et copier les données de l'ancienne table dans la nouvelle table, puis remplacer l'ancienne table avec la nouvelle table.

Était-ce utile?

La solution

Info

AS400 vous donne un avertissement (message d'enquête) en raison de la perte de données possible, vous demandant d'annuler ou ignorer l'opération demandée. Donc, beacuse de cet être une demande interactive, sur JDBC / ODBC vous ne pouvez pas taper I à ignorer, et comme vous jette un ErrorCode: -952 avec SQLState:. 57014 et code de raison 10

Dans la documentation de SQL0952 dit:

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.

Si vous utilisez JDBC et l'erreur SQL n'est pas explicite, vous pouvez établir une connexion JDBC avec le paramètre ' erreurs = full , qui donnera beaucoup plus d'informations sur l'erreur. Pour les autres paramètres de connexion, voir cette .

chaîne de connexion par exemple:

  

jdbc: AS400: // serverName; bibliothèques = * libl, nommant = système; erreurs = full

Avec cette connexion l'erreur résultant serait comme ceci:

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 solution

Enfin, si vous ne pouvez pas utiliser STRSQL, une autre solution consiste à utiliser iSeries Navigator, pour être exact ses "Exécuter des scripts SQL" (il est habituellement ici -> « % Program Files% \ IBM \ Client Access \ Shared \ cwbundbs.exe ").

Mais tout d'abord, vous devez ajouter un paramètre de réponse du système ( une seule fois par machine )

  

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

Ceci est fait dans « écran vert ». Ceci définit une réponse deafult ( 'I') sur le message de demande de CPA32B2. Le CPA32B2 est un identifiant de massage interne, qui est liée à une opération de la colonne de chute.

(Il ne fait pas avoir à faire dans « écran vert », l'utiliser comme commande CHGJOB Exemple:.

  

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

)

Maintenant, vous pouvez commencer à « Exécuter des scripts SQL », la première commande à exécuter est:

  

cl: CHGJOB INQMSGRPY (* SYSRPYL);

paramètre

cela change la tâche en cours INQMSGRPY , à * SYSRPYL. * SYSRPYL amène à rechercher si existe un paramètre de réponse du système lorsqu'un message d'interrogation doit être affiché.

Maintenant vous pouvez lancer votre alter qui supprime la colonne.


Malheureusement, je ne sais pas comment déposer une colonne, juste en utilisant JDBC. Si quelqu'un sait s'il vous plaît laissez-moi savoir.

Références:

Autres conseils

Enfin, je trouve une solution:

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


ALTER TABLE <tablename> DROP COLUMN <column_name>;                

Il n'y a pas assez d'informations dans votre message d'erreur pour être sûr, mais la suppression d'une colonne de clé primaire est généralement très risqué et la base de données fait correctement, il est difficile.

Vous avez probablement une contrainte de clé étrangère impliquant cette colonne.

Ne laissez pas tomber la contrainte et supprimer cette colonne, sauf si vous êtes sûr que vous savez ce que vous faites.

D'après ce message: http://bytes.com/topic / db2 / réponses / 185467-drop-colonne de table

Il est possible de déposer une colonne à l'aide STRSQL dans l'environnement de l'écran vert. J'avoir accès à cela et il fonctionne, mais un client avec 400 n'a pas le programme autorisé à utiliser STRSQL. Le problème est que STRSQL demandera à si cela est quelque chose que je veux vraiment faire.

Pour obtenir les données que je utilise SQL client Écureuil avec le pilote JDBC jt400 ... Je suppose que le système en insistant sur demandant (et en fait aucun moyen d'obtenir le même rapide sans STRSQL), il ne laissera pas moi de le faire.

Je suppose que je suis coincé faire ce que je fais ... la création d'une nouvelle table et la copie des données et échanger les tables.

La seule manière que je trouvais pour obtenir jdbc au travail est d'abord modifier manuellement la valeur par défaut pour ce message. Ensuite, exécutez votre application de mise à jour. Dans notre cas, nous utilisons Liquibase. Je pourrais obtenir CommandCall appeler ADDRPYLE et CHGJOB INQMSGRPY du java (* SYSRPYL), mais il n'a jamais vraiment permis alter table * colonne de goutte * pour ne pas donner l'erreur suivante:

Erreur:

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

Commande de travail:

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

Référence:

écran vert - STRSQL vous donnera erreur msg réponse

alter table devlibsc / trklst colonne de chute "ST"

Changement de fichier TRKLST peut provoquer une perte de données. (C I)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top