DB2 - Problem description
| Problem IC67289 | Status: Closed |
INSERT INTO A VIEW THAT IS BASED ON A VIEW WITH INSTEAD-OF TRIGGER MAY RETURN SQL0901N. | |
| product: | |
DB2 FOR LUW / DB2FORLUW / 970 - DB2 | |
| Problem description: | |
INSERT into a view V1 may return SQL901N with reason "parent in
1-1 rel. already has child"
when all of the following conditions are satisfied:
(1) View V1 is based on another view V0
(2) View V0 is based on a table T1 that has a column (COLDEFVAL)
with DEFAULT value
(3) In the SELECT list of the definition of view V0, a column
without default value is listed *after* column COLDEFVAL.
(4) olumn COLDEFVAL is not referenced in the definition of view
V1
(5) An insead-of INSERT trigger is defined on view V0.
Example:
CREATE TABLE T1 (C1 int,
COLDEFVAL int with default 1);
CREATE VIEW V0 AS
SELECT
COLDEFVAL,
C1
FROM T1;
CREATE TRIGGER TRG1
INSTEAD OF INSERT ON V0
REFERENCING NEW AS N
FOR EACH ROW
MODE DB2SQL
BEGIN ATOMIC
insert into t1 values (N.C1, DEFAULT);--
END;
CREATE VIEW V1 AS
SELECT C1
FROM V0;
INSERT INTO V1 values (10); | |
| Problem Summary: | |
INSERT into a view V1 may return SQL901N with reason "parent in
1-1 rel. already has child"
when all of the following conditions are satisfied:
(1) View V1 is based on another view V0
(2) View V0 is based on a table T1 that has a column (COLDEFVAL)
with DEFAULT value
(3) In the SELECT list of the definition of view V0, a column
without default value is listed *after* column COLDEFVAL.
(4) olumn COLDEFVAL is not referenced in the definition of view
V1
(5) An insead-of INSERT trigger is defined on view V0.
Example:
CREATE TABLE T1 (C1 int,
COLDEFVAL int with default 1);
CREATE VIEW V0 AS
SELECT
COLDEFVAL,
C1
FROM T1;
CREATE TRIGGER TRG1
INSTEAD OF INSERT ON V0
REFERENCING NEW AS N
FOR EACH ROW
MODE DB2SQL
BEGIN ATOMIC
insert into t1 values (N.C1, DEFAULT);--
END;
CREATE VIEW V1 AS
SELECT C1
FROM V0;
INSERT INTO V1 values (10); | |
| Local Fix: | |
In the definition of the intermediate view (V0 in the example
above) with instead-of-trigger, put those columns (e.g.
COLDEFVAL) that are not referenced in the referencng view (e.g.
V1) at the end.
For example:
CREATE VIEW V0 AS
SELECT
C1,
COLDEFVAL <<<<< Put
COLDEFVAL last.
FROM T1;
Note: Changing the column order in a view definition changes the
order of columns returned by queries like "SELECT * from V0".
Existing applications with queries that relies on the previous
column order may be affected. Queries that list the columns
explicitly (instead of select *) will not be affected. | |
| available fix packs: | |
DB2 Version 9.7 Fix Pack 3 for Linux, UNIX, and Windows | |
| Solution | |
Defect => wsdbu00627865 Fixed in => v9.7 + FP3 Module => engn_sqnq | |
| Workaround | |
In the definition of the intermediate view (V0 in the example
above) with instead-of-trigger, put those columns (e.g.
COLDEFVAL) that are not referenced in the referencng view (e.g.
V1) at the end.
For example:
CREATE VIEW V0 AS
SELECT
C1,
COLDEFVAL <<<<< Put
COLDEFVAL last.
FROM T1;
Note: Changing the column order in a view definition changes the
order of columns returned by queries like "SELECT * from V0".
Existing applications with queries that relies on the previous
column order may be affected. Queries that list the columns
explicitly (instead of select *) will not be affected. | |
| Timestamps | |
Date - problem reported : Date - problem closed : Date - last modified : | 17.03.2010 24.09.2010 24.09.2010 |
| 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.3 |
|
| 9.7.0.3 |
|