Временная таблица системного периода и FOREIGN KEY ... ON DELETE CASCADE - PullRequest
1 голос
/ 10 марта 2019

Я получаю сообщение об ошибке, когда пытаюсь добавить ограничение FOREIGN KEY ... ON DELETE CASCADE к временной таблице системного периода - в моем примере ниже таблицы STATE.

Я могучтобы очистка выполнялась прикладным уровнем, но я бы предпочел, чтобы база данных занималась собственным обслуживанием.

Родительская таблица:

0001.00 -- *************************************************************************************************
0002.00 -- Create the table.                                                                                
0003.00 -- *************************************************************************************************
0004.00 CREATE OR REPLACE TABLE country (                                                                   
0005.00   iso2   CHAR(2) NOT NULL,                                                                          
0006.00   iso3   CHAR(3) NOT NULL,                                                                          
0007.00   isonum CHAR(3) NOT NULL,                                                                          
0008.00   name   VARCHAR(45) NOT NULL,                                                                      
0009.00   sys_start                                                                                         
0010.00     TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN IMPLICITLY HIDDEN,                         
0011.00   sys_end                                                                                           
0012.00     TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END IMPLICITLY HIDDEN,                           
0013.00   sys_ts                                                                                            
0014.00     TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS TRANSACTION START ID                                 
0015.00     IMPLICITLY HIDDEN,                                                                              
0016.00   PERIOD SYSTEM_TIME(sys_start, sys_end),                                                           
0017.00   PRIMARY KEY(iso2)                                                                                 
0018.00 ) RCDFMT rcountry;                                                                                  
0019.00                                                                                                     
0020.00 COMMIT;                                                                                             
0021.00                                                                                                     
0022.00 -- *************************************************************************************************
0023.00 -- Create a history table to track all changes.                                                     
0024.00 -- *************************************************************************************************
0025.00 CREATE OR REPLACE TABLE countryh LIKE country;                                                      
0026.00                                                                                                     
0027.00 COMMIT;                                                                                             
0028.00                                                                                                     
0029.00 -- *************************************************************************************************
0030.00 -- Associate our history table with the main table and tell the system to add a row to the history  
0031.00 -- table when a row is deleted so we'll have a record of the deletion.                              
0032.00 -- *************************************************************************************************
0033.00 ALTER TABLE country ADD VERSIONING USE HISTORY TABLE countryh                                       
0034.00   ON DELETE ADD EXTRA ROW;                                                                          
0035.00                                                                                                     
0036.00 COMMIT;                                                                                             

Дочерняя таблица:

0001.00 -- *************************************************************************************************
0002.00 -- Create the table.                                                                                
0003.00 -- ****************************************************************************|********************
0004.00 CREATE OR REPLACE TABLE state (                                                                     
0005.00   id BIGINT GENERATED ALWAYS AS IDENTITY (START WITH 1 CYCLE),                                      
0006.00   cntry_id CHAR(2) NOT NULL,                                                                        
0007.00   code     VARCHAR(3) NOT NULL,                                                                     
0008.00   name     VARCHAR(35) NOT NULL,                                                                    
0009.00   sys_start                                                                                         
0010.00     TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN IMPLICITLY HIDDEN,                         
0011.00   sys_end                                                                                           
0012.00     TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END IMPLICITLY HIDDEN,                           
0013.00   sys_ts                                                                                            
0014.00     TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS TRANSACTION START ID                                 
0015.00     IMPLICITLY HIDDEN,                                                                              
0016.00   PERIOD SYSTEM_TIME(sys_start, sys_end),                                                           
0017.00   PRIMARY KEY(id),                                                                                  
0018.00   UNIQUE (cntry_id, code)                                                                           
0019.00 ) RCDFMT rstate;                                                                                    
0020.00                                                                                                     
0021.00 COMMIT;                                                                                             
0022.00                                                                                                     
0023.00 -- *************************************************************************************************
0024.00 -- Create a history table to track all changes.                                                     
0025.00 -- *************************************************************************************************
0026.00 CREATE OR REPLACE TABLE stateh LIKE state;                                                          
0027.00                                                                                                     
0028.00 COMMIT;                                                                                             
0029.00                                                                                                     
0030.00 -- *************************************************************************************************
0031.00 -- Associate our history table with the main table and tell the system to add a row to the history  
0032.00 -- table when a row is deleted so we'll have a record of the deletion.                              
0033.00 -- *************************************************************************************************
0034.00 ALTER TABLE state ADD VERSIONING USE HISTORY TABLE stateh                                           
0035.00   ON DELETE ADD EXTRA ROW;                                                                          
0036.00                                                                                                     
0037.00 COMMIT;                                                                                             
0038.00                                                                                                     
0039.00 ALTER TABLE state ADD FOREIGN KEY(cntry_id) REFERENCES country(iso2)                                
0040.00   ON DELETE CASCADE;
0041.00                     
0042.00 COMMIT;             

Ошибка , показанная в моем списке компиляции:

MSG ID  SEV  RECORD  TEXT
SQ20525  30      39  Position 1 Operation on table STATE in HILLB1 not
                     allowed.                                         

Ошибка, отображаемая в моем журнале заданий:

Constraint is not valid.

Когда я делаю F1запросите дополнительную информацию:

Message . . . . :   Constraint is not valid.                                 
Cause . . . . . :   Constraint *N cannot be added for file STATE in library  
  HILLB1 for TYPE value *N. For a referential constraint (TYPE *REFCST), the 
  parent file *N in library *N has a delete rule of *N and update rule of *N.
  The constraint was not added because of errors. The reason code is 6. The  
  reason codes and their meanings are as follows:                            
    06 - The file is a system-period temporal table and the referential    
  constraint cannot use the delete rule of *CASCADE, *SETDFT, and *SETNULL.

Очевидно, Db2 для i не нравится то, что я пытаюсь сделать.

Я также пытался поставитьFOREIGN KEY определите в операторе CREATE OR REPLACE TABLE и получите ту же ошибку (хотя и в строке 34).

Действительно ли нет способа удалить зависимую таблицу (то есть временную таблицу системного периода) deleteсвязанные строки, когда родительская таблица удаляет строку?

...