DB2 - Problem description
Problem IC75035 | Status: Closed |
POSITIONED/SEARCHED UPDATE AND DELETE IN DB2 CONTROL CENTER MIGHT CORRUPT DATA. | |
product: | |
DB2 FOR LUW / DB2FORLUW / 970 - DB2 | |
Problem description: | |
"positioned UPDATE and DELETE" was introduced in V9.5 DB2 Control Center by the fix of APAR IZ31390 as a complement of searched UPDATE and DELETE. However in some scenarios positioned/searched UPDATE and DELETE will UPDATE/DELETE rows that you do not want to UPDATE/DELETE, therefore corrupt the data. Here is an example of positioned UPDATE: ================================ db2 "create db us_db using codeset 1252 territory US" db2set db2codepage=1252 db2 terminate db2 "connect to us_db" db2 "create table test1 (id char(1), name char(8)) db2 "insert into test1 values ('1', 'bbb')" db2 "insert into test1 values ('2', 'bbb')" db2 "insert into test1 values ('3', 'bbb')" # check the original values in the table select * from db2inst1.test1 ID NAME -- -------- 1 bbb 2 bbb 3 bbb 3 record(s) selected. # Perform following SQL query in DB2 Control Center: select name from db2inst1.test1 where id='2' # After Control Center returns the result, edit the value from 'bbb' to 'bbbtest1' and click on COMMIT. # Check the result of positioned UPDATE db2 "select * from db2inst1.test1" ID NAME -- -------- 1 bbbtest1 --> this row was wrongly updated 2 bbb --> the expected row was not updated 3 bbb 3 record(s) selected. ================================ According to current design, DB2 Control Center will not be able to know which row(s) to be updated/deleted if the columns in predicates are not included in the SELECT clause. For above example, column "id" was in the predicate but missed from the SELECT clause. As a result, DB2 Control Center could not update the row with "id=2". Instead, it updated the 1st row with "name='bbb'", i.e. the row with "id=1". After applying the fix, each time you perform positioned/searched UPDATE and DELETE in DB2 Control Center and try to COMMIT the result, a warning message will pop out to remind you of the possible data corruption and ask for your input for committing the changes or not. | |
Problem Summary: | |
**************************************************************** * USERS AFFECTED: * * All users of version 9.7 on Linux, Unix and Windows * * platforms. * **************************************************************** * PROBLEM DESCRIPTION: * * "positioned UPDATE and DELETE" was introduced in V9.5 DB2 * * Control Center by the fix of APAR IZ31390 as a complement of * * searched UPDATE and DELETE. * * However in some scenarios positioned/searched UPDATE and * * DELETE will UPDATE/DELETE rows that you do not want to * * UPDATE/DELETE, therefore corrupt the data. * * * * Here is an example of positioned UPDATE: * * ================================ * * db2 "create db us_db using codeset 1252 territory US" * * * * db2set db2codepage=1252 * * * * db2 terminate * * db2 "connect to us_db" * * * * db2 "create table test1 (id char(1), name char(8)) * * db2 "insert into test1 values ('1', 'bbb')" * * db2 "insert into test1 values ('2', 'bbb')" * * db2 "insert into test1 values ('3', 'bbb')" * * * * # check the original values in the table * * select * from db2inst1.test1 * * * * ID NAME * * -- -------- * * 1 bbb * * 2 bbb * * 3 bbb * * * * 3 record(s) selected. * * * * # Perform following SQL query in DB2 Control Center: * * select name from db2inst1.test1 where id='2' * * # After Control Center returns the result, edit the value * * from 'bbb' to 'bbbtest1' and click on COMMIT. * * * * # Check the result of positioned UPDATE * * db2 "select * from db2inst1.test1" * * * * ID NAME * * -- -------- * * 1 bbbtest1 --> this row was wrongly updated * * 2 bbb --> the expected row was not updated * * 3 bbb * * * * 3 record(s) selected. * * ================================ * * * * According to current design, DB2 Control Center will not be * * able to know which row(s) to be updated/deleted if the * * columns in predicates are not included in the SELECT clause. * * For above example, column "id" was in the predicate but * * missed from the SELECT clause. As a result, DB2 Control * * Center could not update the row with "id=2". Instead, it * * updated the 1st row with "name='bbb'", i.e. the row with * * "id=1". * * * * After applying the fix, each time you perform * * positioned/searched UPDATE and DELETE in DB2 Control Center * * and try to COMMIT the result, a warning message will pop out * * to remind you of the possible data corruption and ask for * * your input for committing the changes or not. * **************************************************************** * RECOMMENDATION: * * Upgrade to DB2 UDB Version 9.7 FixPak 5 or higher levels. * **************************************************************** | |
Local Fix: | |
Including all the necessary columns in the SELECT clause. For the example in 'Problem Description', perform following statement: select id, name from db2inst1.test1 where id='2' to replace the original one: select name from db2inst1.test1 where id='2' | |
available fix packs: | |
DB2 Version 9.7 Fix Pack 5 for Linux, UNIX, and Windows | |
Solution | |
First fixed in DB2 LUW Version 9.7 FixPak 5. | |
Workaround | |
Including all the necessary columns in the SELECT clause. For the example in 'Problem Description', perform following statement: select id, name from db2inst1.test1 where id='2' to replace the original one: select name from db2inst1.test1 where id='2' | |
Timestamps | |
Date - problem reported : Date - problem closed : Date - last modified : | 15.03.2011 17.01.2012 17.01.2012 |
Problem solved at the following versions (IBM BugInfos) | |
9.7. | |
Problem solved according to the fixlist(s) of the following version(s) | |
9.7.0.5 |