[ 
https://issues.apache.org/jira/browse/DERBY-4984?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mamta A. Satoor updated DERBY-4984:
-----------------------------------

    Labels: derby_backport_reject_10_5 derby_backport_reject_10_6 
derby_backport_reject_10_7 derby_triage10_8  (was: derby_triage10_8)
    
> ALTER TABLE DROP COLUMN may leave triggers invalid even if they are not using 
> the column getting dropped.
> ---------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-4984
>                 URL: https://issues.apache.org/jira/browse/DERBY-4984
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.3.1.4, 10.3.2.1, 10.3.3.0, 10.4.1.3, 10.4.2.0, 
> 10.5.1.1, 10.5.2.0, 10.5.3.0, 10.6.1.0, 10.6.2.1, 10.7.1.1
>            Reporter: Mamta A. Satoor
>            Assignee: Mamta A. Satoor
>              Labels: derby_backport_reject_10_5, derby_backport_reject_10_6, 
> derby_backport_reject_10_7, derby_triage10_8
>             Fix For: 10.7.1.4, 10.8.2.2
>
>
> While doing testing for DERBY-4887, I found a case where ALTER TABLE DROP 
> COLUMN will leave triggers in invalid state even if those triggers are not 
> using the column getting dropped. eg
> CREATE TABLE tab ( 
>        element_id INTEGER NOT NULL, 
>        altered_id VARCHAR(30) NOT NULL
> ); 
> insert into tab values(1,'aa');
> -- Create a trigger against the table 
> CREATE TRIGGER mytrig 
>  AFTER UPDATE OF altered_id ON tab 
>  REFERENCING NEW AS newt OLD AS oldt 
>  FOR EACH ROW MODE DB2SQL 
>   SELECT newt.altered_id from tab;
> --Drop the first column in the table. This will cause the column positions to 
> be recalculated within the table
> alter table tab drop column element_id; 
> --mytrig is still looking for column altered_id at position 2 but drop column 
> has changed it's position within the table to 1
> update tab set altered_id='bb';
> As shown in the example above, table "TAB" only has 2 columns. The trigger 
> "MYTRIG" uses the 2nd column in it's trigger action through the REFERENCING 
> clause. During trigger action sql parsing, every column referenced through 
> REFERENCING clause gets transformed into a reference to the column through 
> it's column position in the trigger table(this change to look for columns 
> based on their column positions rather than the name went in as revision 
> 397959 with following commit comments DERBY-1258 Change the generated code 
> for a new/old column in a row trigger to access columns by position and not 
> name to avoid the case-insensitive name lookup specified by JDBC.) When in 
> the script above, we drop the column in position 1, the trigger "MYTRIG" ends 
> up becoming invalid because column being used in the trigger action is no 
> more in column position 2.
> One possible solution is to regenerate the SPSDescriptor associated with the 
> trigger action for all the triggers defined on the table whose column is 
> getting dropped. We could be little smarter and only regenerate the 
> SPSDescriptor for the triggers who use the REFERENCING clause. But we need to 
> do more testing to make sure that triggers without REFERENCING clause do not 
> get impacted by a drop of column which is not the last column of the table. 
> This optimization of recognizing the right triggers may not be worth it since 
> performance may not be that big a criteria for an ALTER TABLE DROP COLUMN 
> which should be a rare operation in a production system.
> An interim solution to this problem is obviously to drop and recreate the 
> triggers

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to