diff --git a/openbis/source/sql/generic/027/data-027.sql b/openbis/source/sql/generic/027/data-027.sql index 2221246b2746044646eb9b414ef11b8b0aa74506..1f6ac9163898dec179aec5e86c09b3bff9fddfd9 100644 --- a/openbis/source/sql/generic/027/data-027.sql +++ b/openbis/source/sql/generic/027/data-027.sql @@ -465,36 +465,42 @@ insert into sample_types (id ,code ,description -,dbin_id) +,dbin_id +,generated_from_depth) values (nextval('SAMPLE_TYPE_ID_SEQ') ,'DILUTION_PLATE' ,'Dilution Plate' ,(select id from database_instances where code = 'SYSTEM_DEFAULT') +,1 ); insert into sample_types (id ,code ,description -,dbin_id) +,dbin_id +,generated_from_depth) values (nextval('SAMPLE_TYPE_ID_SEQ') ,'CELL_PLATE' ,'Cell Plate' ,(select id from database_instances where code = 'SYSTEM_DEFAULT') +,2 ); insert into sample_types (id ,code ,description -,dbin_id) +,dbin_id +,generated_from_depth) values (nextval('SAMPLE_TYPE_ID_SEQ') ,'REINFECT_PLATE' ,'Re-infection Plate' ,(select id from database_instances where code = 'SYSTEM_DEFAULT') +,3 ); insert into sample_types @@ -513,12 +519,18 @@ insert into sample_types (id ,code ,description -,dbin_id) +,dbin_id +,is_listable +,generated_from_depth +,part_of_depth) values (nextval('SAMPLE_TYPE_ID_SEQ') ,'WELL' ,'Plate Well' ,(select id from database_instances where code = 'SYSTEM_DEFAULT') +,'F' +,0 +,1 ); diff --git a/openbis/source/sql/generic/027/schema-027.sql b/openbis/source/sql/generic/027/schema-027.sql index c7e4a3238518130cd03954c8bc6878dcf7afd956..db835d89e208b8f132a93f964b335d53dad03d18 100644 --- a/openbis/source/sql/generic/027/schema-027.sql +++ b/openbis/source/sql/generic/027/schema-027.sql @@ -29,6 +29,7 @@ -- 14. OBSERVABLE_TYPES renamed to DATA_SET_TYPES -- 15. OBSERVABLE_TYPE_ID_SEQ renamed to DATA_SET_TYPE_ID_SEQ -- 16. DATA.OBTY_ID renamed to DATA.DSTY_ID; +-- 17. some others - the source model should be updated to make these Post-Generation Modifications minimal ------------------------------------------------------------------------------------ -- Creating domains @@ -88,8 +89,8 @@ CREATE TABLE SAMPLES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,SAMP_ID_TOP TECH_ID CREATE TABLE SAMPLE_INPUTS (SAMP_ID TECH_ID NOT NULL,PROC_ID TECH_ID NOT NULL); CREATE TABLE SAMPLE_MATERIAL_BATCHES (SAMP_ID TECH_ID NOT NULL,MABA_ID TECH_ID NOT NULL); CREATE TABLE SAMPLE_PROPERTIES (ID TECH_ID NOT NULL,SAMP_ID TECH_ID NOT NULL,STPT_ID TECH_ID NOT NULL,VALUE GENERIC_VALUE,CVTE_ID TECH_ID,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP); -CREATE TABLE SAMPLE_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_80,DBIN_ID TECH_ID NOT NULL); -CREATE TABLE SAMPLE_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,SATY_ID TECH_ID NOT NULL,PRTY_ID TECH_ID NOT NULL,IS_MANDATORY BOOLEAN_CHAR NOT NULL DEFAULT 'F',IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F',PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP); +CREATE TABLE SAMPLE_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_80,DBIN_ID TECH_ID NOT NULL, IS_LISTABLE BOOLEAN_CHAR NOT NULL DEFAULT 'T', GENERATED_FROM_DEPTH INTEGER NOT NULL DEFAULT 0, PART_OF_DEPTH INTEGER NOT NULL DEFAULT 0); +CREATE TABLE SAMPLE_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,SATY_ID TECH_ID NOT NULL,PRTY_ID TECH_ID NOT NULL,IS_MANDATORY BOOLEAN_CHAR NOT NULL DEFAULT 'F',IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F',PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, IS_DISPLAYED BOOLEAN_CHAR NOT NULL DEFAULT 'T'); -- Creating sequences diff --git a/openbis/source/sql/postgresql/migration/migration-026-027.sql b/openbis/source/sql/postgresql/migration/migration-026-027.sql index 071cd448e16478deb3d51f314f21b77c745560c7..4c1570468cbfdb2fa52a19c3460bc0907ebb5669 100644 --- a/openbis/source/sql/postgresql/migration/migration-026-027.sql +++ b/openbis/source/sql/postgresql/migration/migration-026-027.sql @@ -2,3 +2,26 @@ ALTER TABLE ROLE_ASSIGNMENTS DROP CONSTRAINT ROAS_BK_UK; ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_GROUP_BK_UK UNIQUE(PERS_ID_GRANTEE,ROLE_CODE,GROU_ID); ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_INSTANCE_BK_UK UNIQUE(PERS_ID_GRANTEE,ROLE_CODE,DBIN_ID); + +-- add display properties to sample type + +ALTER TABLE SAMPLE_TYPES ADD COLUMN IS_LISTABLE BOOLEAN_CHAR NOT NULL DEFAULT 'T'; +ALTER TABLE SAMPLE_TYPES ADD COLUMN GENERATED_FROM_DEPTH INTEGER NOT NULL DEFAULT 0; +ALTER TABLE SAMPLE_TYPES ADD COLUMN PART_OF_DEPTH INTEGER NOT NULL DEFAULT 0; +ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ADD COLUMN IS_DISPLAYED BOOLEAN_CHAR NOT NULL DEFAULT 'T'; + +update sample_types +set generated_from_depth = 1 +where code = 'DILUTION_PLATE'; + +update sample_types +set generated_from_depth = 2 +where code = 'CELL_PLATE'; + +update sample_types +set generated_from_depth = 3 +where code = 'REINFECT_PLATE'; + +update sample_types +set is_listable = 'F', generated_from_depth = 0, part_of_depth = 1 +where code = 'WELL'; diff --git a/openbis/sourceTest/sql/postgresql/027/009=database_version_logs.tsv b/openbis/sourceTest/sql/postgresql/027/009=database_version_logs.tsv index cfa56b5d9c7467f04285a1a9fa89edb1ac4e000e..7e5cffe45ddf64477fa96d9f6f1d3e06419a38fa 100644 --- a/openbis/sourceTest/sql/postgresql/027/009=database_version_logs.tsv +++ b/openbis/sourceTest/sql/postgresql/027/009=database_version_logs.tsv @@ -11,12 +11,12 @@ 016 source/sql/postgresql/migration/migration-015-016.sql SUCCESS 2008-05-09 10:12:52.062 ----------------------------------------------------------------------------------------------\\012-- File: migration-015-016.sql\\012--\\012-- \\012-- This script enables the migration of the database schema from 015 to 016.\\012-- \\012-- Update History\\012--\\012--\\012--\\011Who\\011\\011\\011When\\011\\011What\\012--\\011---\\011\\011\\011----\\011\\011----\\012--\\011Bernd Rinn\\0112008-03-22\\011Initial Version \\012-- \\012----------------------------------------------------------------------------------------------\\012\\012\\012--=================================\\012-- New Domains\\012--=================================\\012\\012-----------------------------------------------------------------------------------\\012-- Purpose: Change all CODE columns to LONG_CODE, then re-create DOMAIN CODE identical to LONG_CODE\\012-- and change LONG_CODE columns back to the (new) CODE \\012-----------------------------------------------------------------------------------\\012\\012-- First step: create new domain LONG_CODE\\012CREATE DOMAIN LONG_CODE AS VARCHAR(40);\\012\\012-- Second step: change all CODE to LONG_CODE\\012ALTER TABLE CONTROLLED_VOCABULARIES ALTER COLUMN CODE TYPE LONG_CODE;\\012ALTER TABLE DATA_TYPES ALTER COLUMN CODE TYPE LONG_CODE;\\012ALTER TABLE EXPERIMENTS ALTER COLUMN CODE TYPE LONG_CODE;\\012ALTER TABLE EXPERIMENT_TYPES ALTER COLUMN CODE TYPE LONG_CODE;\\012ALTER TABLE FILE_FORMAT_TYPES ALTER COLUMN CODE TYPE LONG_CODE;\\012ALTER TABLE LOCATOR_TYPES ALTER COLUMN CODE TYPE LONG_CODE;\\012ALTER TABLE MATERIALS ALTER COLUMN CODE TYPE LONG_CODE;\\012ALTER TABLE MATERIAL_BATCHES ALTER COLUMN CODE TYPE LONG_CODE;\\012ALTER TABLE MATERIAL_TYPES ALTER COLUMN CODE TYPE LONG_CODE;\\012ALTER TABLE OBSERVABLE_TYPES ALTER COLUMN CODE TYPE LONG_CODE;\\012ALTER TABLE ORGANIZATIONS ALTER COLUMN CODE TYPE LONG_CODE;\\012ALTER TABLE PROCEDURE_TYPES ALTER COLUMN CODE TYPE LONG_CODE;\\012ALTER TABLE PROJECTS ALTER COLUMN CODE TYPE LONG_CODE;\\012ALTER TABLE PROPERTY_TYPES ALTER COLUMN CODE TYPE LONG_CODE;\\012ALTER TABLE SAMPLES ALTER COLUMN CODE TYPE LONG_CODE;\\012ALTER TABLE SAMPLE_COMPONENTS ALTER COLUMN CODE TYPE LONG_CODE;\\012ALTER TABLE SAMPLE_TYPES ALTER COLUMN CODE TYPE LONG_CODE;\\012\\012-- Third step: re-create CODE as VARCHAR(40)\\012DROP DOMAIN CODE;\\012CREATE DOMAIN CODE AS VARCHAR(40);\\012\\012-- Forth step: change all LONG_CODE columns back to CODE\\012ALTER TABLE CONTROLLED_VOCABULARIES ALTER COLUMN CODE TYPE CODE;\\012ALTER TABLE DATA_TYPES ALTER COLUMN CODE TYPE CODE;\\012ALTER TABLE EXPERIMENTS ALTER COLUMN CODE TYPE CODE;\\012ALTER TABLE EXPERIMENT_TYPES ALTER COLUMN CODE TYPE CODE;\\012ALTER TABLE FILE_FORMAT_TYPES ALTER COLUMN CODE TYPE CODE;\\012ALTER TABLE LOCATOR_TYPES ALTER COLUMN CODE TYPE CODE;\\012ALTER TABLE MATERIALS ALTER COLUMN CODE TYPE CODE;\\012ALTER TABLE MATERIAL_BATCHES ALTER COLUMN CODE TYPE CODE;\\012ALTER TABLE MATERIAL_TYPES ALTER COLUMN CODE TYPE CODE;\\012ALTER TABLE OBSERVABLE_TYPES ALTER COLUMN CODE TYPE CODE;\\012ALTER TABLE ORGANIZATIONS ALTER COLUMN CODE TYPE CODE;\\012ALTER TABLE PROCEDURE_TYPES ALTER COLUMN CODE TYPE CODE;\\012ALTER TABLE PROJECTS ALTER COLUMN CODE TYPE CODE;\\012ALTER TABLE PROPERTY_TYPES ALTER COLUMN CODE TYPE CODE;\\012ALTER TABLE SAMPLES ALTER COLUMN CODE TYPE CODE;\\012ALTER TABLE SAMPLE_COMPONENTS ALTER COLUMN CODE TYPE CODE;\\012ALTER TABLE SAMPLE_TYPES ALTER COLUMN CODE TYPE CODE;\\012\\012-- Fifth step: drop domain LONG_CODE\\012DROP DOMAIN LONG_CODE;\\012\\012-----------------------------------------------------------------------------------\\012-- Purpose: Create new domain TIME_STAMP_DFL and change current users of TIME_STAMP to TIME_STAMP_DFL\\012-- This adds time zone information and allows for a clean separation between registration time stamps\\012-- which should have a default of CURRENT_TIMESTAMP and other time stamps which should not. \\012-----------------------------------------------------------------------------------\\012\\012-- First step: create new domain TIME_STAMP_DFL\\012CREATE DOMAIN TIME_STAMP_DFL AS TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP;\\012\\012-- Second step: change all TIME_STAMP columns to TIME_STAMP_DFL\\012ALTER TABLE CONTROLLED_VOCABULARIES ALTER COLUMN REGISTRATION_TIMESTAMP TYPE TIME_STAMP_DFL;\\012ALTER TABLE CONTROLLED_VOCABULARIES ALTER COLUMN REGISTRATION_TIMESTAMP DROP NOT NULL;\\012ALTER TABLE CONTROLLED_VOCABULARIES ALTER COLUMN REGISTRATION_TIMESTAMP DROP DEFAULT;\\012ALTER TABLE CONTROLLED_VOCABULARY_TERMS ALTER COLUMN REGISTRATION_TIMESTAMP TYPE TIME_STAMP_DFL;\\012ALTER TABLE CONTROLLED_VOCABULARY_TERMS ALTER COLUMN REGISTRATION_TIMESTAMP DROP NOT NULL;\\012ALTER TABLE CONTROLLED_VOCABULARY_TERMS ALTER COLUMN REGISTRATION_TIMESTAMP DROP DEFAULT;\\012ALTER TABLE DATA ALTER COLUMN REGISTRATION_TIMESTAMP TYPE TIME_STAMP_DFL;\\012ALTER TABLE DATA ALTER COLUMN REGISTRATION_TIMESTAMP DROP NOT NULL;\\012ALTER TABLE DATA ALTER COLUMN REGISTRATION_TIMESTAMP DROP DEFAULT;\\012ALTER TABLE EXPERIMENTS ALTER COLUMN REGISTRATION_TIMESTAMP TYPE TIME_STAMP_DFL;\\012ALTER TABLE EXPERIMENTS ALTER COLUMN REGISTRATION_TIMESTAMP DROP NOT NULL;\\012ALTER TABLE EXPERIMENTS ALTER COLUMN REGISTRATION_TIMESTAMP DROP DEFAULT;\\012ALTER TABLE EXPERIMENT_ATTACHMENTS ALTER COLUMN REGISTRATION_TIMESTAMP TYPE TIME_STAMP_DFL;\\012ALTER TABLE EXPERIMENT_ATTACHMENTS ALTER COLUMN REGISTRATION_TIMESTAMP DROP NOT NULL;\\012ALTER TABLE EXPERIMENT_ATTACHMENTS ALTER COLUMN REGISTRATION_TIMESTAMP DROP DEFAULT;\\012ALTER TABLE EXPERIMENT_PROPERTIES ALTER COLUMN REGISTRATION_TIMESTAMP TYPE TIME_STAMP_DFL;\\012ALTER TABLE EXPERIMENT_PROPERTIES ALTER COLUMN REGISTRATION_TIMESTAMP DROP NOT NULL;\\012ALTER TABLE EXPERIMENT_PROPERTIES ALTER COLUMN REGISTRATION_TIMESTAMP DROP DEFAULT;\\012ALTER TABLE EXPERIMENT_TYPE_PROPERTY_TYPES ALTER COLUMN REGISTRATION_TIMESTAMP TYPE TIME_STAMP_DFL;\\012ALTER TABLE EXPERIMENT_TYPE_PROPERTY_TYPES ALTER COLUMN REGISTRATION_TIMESTAMP DROP NOT NULL;\\012ALTER TABLE EXPERIMENT_TYPE_PROPERTY_TYPES ALTER COLUMN REGISTRATION_TIMESTAMP DROP DEFAULT;\\012ALTER TABLE INVALIDATIONS ALTER COLUMN REGISTRATION_TIMESTAMP TYPE TIME_STAMP_DFL;\\012ALTER TABLE INVALIDATIONS ALTER COLUMN REGISTRATION_TIMESTAMP DROP NOT NULL;\\012ALTER TABLE INVALIDATIONS ALTER COLUMN REGISTRATION_TIMESTAMP DROP DEFAULT;\\012ALTER TABLE MATERIALS ALTER COLUMN REGISTRATION_TIMESTAMP TYPE TIME_STAMP_DFL;\\012ALTER TABLE MATERIALS ALTER COLUMN REGISTRATION_TIMESTAMP DROP NOT NULL;\\012ALTER TABLE MATERIALS ALTER COLUMN REGISTRATION_TIMESTAMP DROP DEFAULT;\\012ALTER TABLE MATERIAL_BATCHES ALTER COLUMN REGISTRATION_TIMESTAMP TYPE TIME_STAMP_DFL;\\012ALTER TABLE MATERIAL_BATCHES ALTER COLUMN REGISTRATION_TIMESTAMP DROP NOT NULL;\\012ALTER TABLE MATERIAL_BATCHES ALTER COLUMN REGISTRATION_TIMESTAMP DROP DEFAULT;\\012ALTER TABLE MATERIAL_PROPERTIES ALTER COLUMN REGISTRATION_TIMESTAMP TYPE TIME_STAMP_DFL;\\012ALTER TABLE MATERIAL_PROPERTIES ALTER COLUMN REGISTRATION_TIMESTAMP DROP NOT NULL;\\012ALTER TABLE MATERIAL_PROPERTIES ALTER COLUMN REGISTRATION_TIMESTAMP DROP DEFAULT;\\012ALTER TABLE MATERIAL_TYPE_PROPERTY_TYPES ALTER COLUMN REGISTRATION_TIMESTAMP TYPE TIME_STAMP_DFL;\\012ALTER TABLE MATERIAL_TYPE_PROPERTY_TYPES ALTER COLUMN REGISTRATION_TIMESTAMP DROP NOT NULL;\\012ALTER TABLE MATERIAL_TYPE_PROPERTY_TYPES ALTER COLUMN REGISTRATION_TIMESTAMP DROP DEFAULT;\\012ALTER TABLE PROCEDURES ALTER COLUMN REGISTRATION_TIMESTAMP TYPE TIME_STAMP_DFL;\\012ALTER TABLE PROCEDURES ALTER COLUMN REGISTRATION_TIMESTAMP DROP NOT NULL;\\012ALTER TABLE PROCEDURES ALTER COLUMN REGISTRATION_TIMESTAMP DROP DEFAULT;\\012ALTER TABLE PROPERTY_TYPES ALTER COLUMN REGISTRATION_TIMESTAMP TYPE TIME_STAMP_DFL;\\012ALTER TABLE PROPERTY_TYPES ALTER COLUMN REGISTRATION_TIMESTAMP DROP NOT NULL;\\012ALTER TABLE PROPERTY_TYPES ALTER COLUMN REGISTRATION_TIMESTAMP DROP DEFAULT;\\012ALTER TABLE SAMPLES ALTER COLUMN REGISTRATION_TIMESTAMP TYPE TIME_STAMP_DFL;\\012ALTER TABLE SAMPLES ALTER COLUMN REGISTRATION_TIMESTAMP DROP NOT NULL;\\012ALTER TABLE SAMPLES ALTER COLUMN REGISTRATION_TIMESTAMP DROP DEFAULT;\\012ALTER TABLE SAMPLE_PROPERTIES ALTER COLUMN REGISTRATION_TIMESTAMP TYPE TIME_STAMP_DFL;\\012ALTER TABLE SAMPLE_PROPERTIES ALTER COLUMN REGISTRATION_TIMESTAMP DROP NOT NULL;\\012ALTER TABLE SAMPLE_PROPERTIES ALTER COLUMN REGISTRATION_TIMESTAMP DROP DEFAULT;\\012ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ALTER COLUMN REGISTRATION_TIMESTAMP TYPE TIME_STAMP_DFL;\\012ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ALTER COLUMN REGISTRATION_TIMESTAMP DROP NOT NULL;\\012ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ALTER COLUMN REGISTRATION_TIMESTAMP DROP DEFAULT;\\012\\012-- Third step: drop old domain TIME_STAMP\\012DROP DOMAIN TIME_STAMP;\\012\\012-- Forth step: create new domain time_stamp\\012CREATE DOMAIN TIME_STAMP AS TIMESTAMP WITH TIME ZONE;\\012\\012--=================================\\012-- New Tables and related objects\\012--=================================\\012\\012------------------------------------------------------------------------------------\\012-- table DATA_SET_RELATIONSHIPS (new)\\012------------------------------------------------------------------------------------\\012\\012-- Creating tables\\012\\012CREATE TABLE DATA_SET_RELATIONSHIPS (ID TECH_ID NOT NULL,DATA_ID_PARENT TECH_ID NOT NULL,DATA_ID_CHILD TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL);\\012\\012-- Creating primary key constraints\\012\\012ALTER TABLE DATA_SET_RELATIONSHIPS ADD CONSTRAINT DSRE_PK PRIMARY KEY(ID);\\012\\012-- Creating unique constraints\\012\\012ALTER TABLE DATA_SET_RELATIONSHIPS ADD CONSTRAINT DSRE_BK_UK UNIQUE(DATA_ID_CHILD,DATA_ID_PARENT);\\012\\012-- Creating foreign key constraints\\012\\012ALTER TABLE DATA_SET_RELATIONSHIPS ADD CONSTRAINT DSRE_DATA_FK_CHILD FOREIGN KEY (DATA_ID_CHILD) REFERENCES DATA(ID);\\012ALTER TABLE DATA_SET_RELATIONSHIPS ADD CONSTRAINT DSRE_DATA_FK_PARENT FOREIGN KEY (DATA_ID_PARENT) REFERENCES DATA(ID);\\012\\012-- Creating sequences\\012\\012CREATE SEQUENCE DATA_SET_RELATIONSHIP_ID_SEQ;\\012\\012-- Creating indexes\\012\\012CREATE INDEX DSRE_DATA_FK_I_CHILD ON DATA_SET_RELATIONSHIPS (DATA_ID_CHILD);\\012CREATE INDEX DSRE_DATA_FK_I_PARENT ON DATA_SET_RELATIONSHIPS (DATA_ID_PARENT);\\012\\012--====================================\\012-- Drop Tables and related objects\\012--====================================\\012\\012------------------------------------------------------------------------------------\\012-- table DATA_VALUES (deleted)\\012------------------------------------------------------------------------------------\\012\\012-- Delete constraints\\012\\012ALTER TABLE DATA_VALUES DROP CONSTRAINT DAVA_PK;\\012ALTER TABLE DATA_VALUES DROP CONSTRAINT DAVA_BK_UK;\\012ALTER TABLE DATA_VALUES DROP CONSTRAINT DAVA_DATA_FK;\\012ALTER TABLE DATA_VALUES DROP CONSTRAINT DAVA_SACO_FK;\\012\\012-- Delete indices\\012\\012DROP INDEX DAVA_DATA_FK_I;\\012DROP INDEX DAVA_SACO_FK_I;\\012\\012-- Delete sequences\\012\\012DROP SEQUENCE DATA_VALUE_ID_SEQ;\\012\\012-- Delete tables\\012\\012DROP TABLE DATA_VALUES;\\012\\012--====================================\\012-- Modifications of existing objects\\012--====================================\\012\\012------------------------------------------------------------------------------------\\012-- table ORGANIZATIONS (changed)\\012-- * rename to GROUPS\\012--\\012-- table DATA (changed)\\012-- * rename column PROC_ID_ACQUIRED_BY into: PROC_ID_PRODUCED_BY\\012-- * add columns:\\012-- ** IS_PLACEHOLDER BOOLEAN_CHAR\\012-- ** CODE CODE\\012-- ** DATA_PRODUCER_CODE CODE\\012-- ** PRODUCTION_TIMESTAMP TIME_STAMP\\012--\\012-- table EXTERNAL_DATA (changed)\\012-- * add column:\\012-- ** CVTE_ID_STOR_FMT TECH_ID NOT NULL\\012--\\012-- table PROPERTY_TYPES (changed)\\012-- * add column IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F'\\012-- * add unique constraint PRTY_BK_UK_LBL for column LABEL\\012--\\012-- tables EXPERIMENT_TYPE_PROPERTY_TYPES, MATERIAL_TYPE_PROPERTY_TYPES, SAMPLE_TYPE_PROPERTY_TYPES\\012-- * make the assignments of property types DESCRIPTION, NUCLEOTIDE_SEQUENCE, OFFSET and GENE_SYMBOL \\012-- to material types internally managed \\012--\\012-- table PROCEDURE_TYPES (changed)\\012-- * add column IS_DATA_ACQUISITION BOOLEAN_CHAR NOT NULL DEFAULT 'F'.\\012--\\012-- all tables\\012-- * convert all codes to upper case\\012------------------------------------------------------------------------------------\\012\\012---------------------------------------------------------------------------------------------------\\012-- Purpose: Rename table ORGANIZATIONS to GROUPS.\\012---------------------------------------------------------------------------------------------------\\012\\012ALTER TABLE PROJECTS DROP CONSTRAINT PROJ_ORGA_FK;\\012ALTER TABLE ORGANIZATIONS DROP CONSTRAINT ORGA_BK_UK;\\012ALTER TABLE ORGANIZATIONS DROP CONSTRAINT ORGA_PK;\\012ALTER TABLE ORGANIZATIONS RENAME TO GROUPS;\\012ALTER INDEX PROJ_ORGA_FK_I RENAME TO PROJ_GROU_FK_I;\\012select RENAME_SEQUENCE('ORGANIZATION_ID_SEQ', 'GROUP_ID_SEQ');\\012ALTER TABLE PROJECTS RENAME COLUMN ORGA_ID TO GROU_ID;\\012ALTER TABLE GROUPS ADD CONSTRAINT GROU_PK PRIMARY KEY(ID);\\012ALTER TABLE GROUPS ADD CONSTRAINT GROU_BK_UK UNIQUE(CODE);\\012ALTER TABLE PROJECTS ADD CONSTRAINT PROJ_GROU_FK FOREIGN KEY (GROU_ID) REFERENCES GROUPS(ID);\\012\\012\\012---------------------------------------------------------------------------------------------------\\012-- Purpose: Add columnd IS_PLACEHOLDER of table DATA.\\012---------------------------------------------------------------------------------------------------\\012\\012ALTER TABLE DATA ADD COLUMN IS_PLACEHOLDER BOOLEAN_CHAR NOT NULL;\\012\\012\\012---------------------------------------------------------------------------------------------------\\012-- Purpose: Add and populate column CODE of table DATA.\\012---------------------------------------------------------------------------------------------------\\012\\012ALTER TABLE DATA ADD COLUMN CODE CODE;\\012\\012CREATE OR REPLACE FUNCTION populate_data_codes() RETURNS integer AS $$\\012DECLARE\\012 rec RECORD;\\012BEGIN\\012 FOR rec IN SELECT * FROM data LOOP\\012 rec.code := to_char(rec.registration_timestamp, 'YYYYMMDDHH24MISSMS') || '-' || to_char(rec.id, 'FM99999999999999999999');\\012 update data set code=rec.code where id=rec.id;\\012 END LOOP;\\012 RETURN 1;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012SELECT populate_data_codes();\\012DROP FUNCTION populate_data_codes();\\012\\012ALTER TABLE DATA ALTER COLUMN CODE SET NOT NULL;\\012ALTER TABLE DATA ADD CONSTRAINT DATA_BK_UK UNIQUE(CODE);\\012\\012---------------------------------------------------------------------------------------------------\\012-- Purpose: Add and populate columns CVTE_ID_STOR_FMT.\\012---------------------------------------------------------------------------------------------------\\012\\012ALTER TABLE EXTERNAL_DATA ADD COLUMN CVTE_ID_STOR_FMT TECH_ID;\\012ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_STOR_FMT_FK FOREIGN KEY (CVTE_ID_STOR_FMT) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID);\\012\\012------------------------------------------------------------------------------------\\012-- Purpose: Create trigger EXTERNAL_DATA_STORAGE_FORMAT_CHECK \\012------------------------------------------------------------------------------------\\012\\012CREATE OR REPLACE FUNCTION EXTERNAL_DATA_STORAGE_FORMAT_CHECK() RETURNS trigger AS $$\\012DECLARE\\012 v_covo_code CODE;\\012BEGIN\\012\\012 select code into v_covo_code from controlled_vocabularies\\012 where id = (select covo_id from controlled_vocabulary_terms where id = NEW.cvte_id_stor_fmt);\\012\\012 -- Check if the data storage format is a term of the controlled vocabulary "STORAGE_FORMAT"\\012 if v_covo_code != '.STORAGE_FORMAT' then\\012 RAISE EXCEPTION 'Insert/Update of Data (Code: %) failed, as its Storage Format is %, but is required to be STORAGE_FORMAT.', NEW.code, v_covo_code;\\012 end if;\\012\\012 RETURN NEW;\\012\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012CREATE TRIGGER EXTERNAL_DATA_STORAGE_FORMAT_CHECK BEFORE INSERT OR UPDATE ON EXTERNAL_DATA\\012 FOR EACH ROW EXECUTE PROCEDURE EXTERNAL_DATA_STORAGE_FORMAT_CHECK();\\012\\012-----------------------------------------------------------------------------------\\012-- Purpose: Create Controlled Vocabulary .STORAGE_FORMAT\\012-----------------------------------------------------------------------------------\\012insert into controlled_vocabularies \\012 ( id\\012 , code\\012 , description\\012 , pers_id_registerer\\012 , is_managed_internally )\\012values (nextval('CONTROLLED_VOCABULARY_ID_SEQ')\\012 , '.STORAGE_FORMAT'\\012 , 'The on-disk storage format of a data set'\\012 , (select id from persons where user_id ='system')\\012 , true);\\012\\012\\012-----------------------------------------------------------------------------------\\012-- Purpose: Create Controlled Vocabulary Terms for STORAGE_FORMAT\\012-----------------------------------------------------------------------------------\\012insert into controlled_vocabulary_terms \\012 ( id\\012 , code\\012 , covo_id \\012 , pers_id_registerer )\\012values (nextval('CVTE_ID_SEQ')\\012 , 'PROPRIETARY'\\012 , (select id from controlled_vocabularies where code = '.STORAGE_FORMAT')\\012 , (select id from persons where user_id ='system'));\\012\\012insert into controlled_vocabulary_terms \\012 ( id\\012 , code\\012 , covo_id \\012 , pers_id_registerer )\\012values (nextval('CVTE_ID_SEQ')\\012 , 'BDS_DIRECTORY'\\012 , (select id from controlled_vocabularies where code = '.STORAGE_FORMAT')\\012 , (select id from persons where user_id ='system'));\\012\\012\\012--------------------------------------------------------------------------\\012-- Purpose: Insert an entry for OBSERVABLE_TYPE UNKNOWN\\012--------------------------------------------------------------------------\\012\\012insert into observable_types\\012(id\\012,code\\012,description)\\012values \\012(nextval('OBSERVABLE_TYPE_ID_SEQ')\\012,'UNKNOWN'\\012,'Unknown'\\012);\\012\\012----------------------------------------------------------------------\\012-- Purpose: Insert an entry for PROCEDURE_TYPE UNKNOWN\\012-----------------------------------------------------------------------\\012\\012insert into procedure_types\\012(id\\012,code\\012,description)\\012values \\012(nextval('PROCEDURE_TYPE_ID_SEQ')\\012,'UNKNOWN'\\012,'Unknown'\\012);\\012\\012\\012---------------------------------------------------------------------------------------------------\\012-- Purpose: Populate external_data.cvte_id_stor_fmt with a default value.\\012---------------------------------------------------------------------------------------------------\\012\\012CREATE OR REPLACE FUNCTION polulate_external_data_cvte_id_stor_fmt() RETURNS integer AS $$\\012DECLARE\\012 rec RECORD;\\012 dfl_stor_fmt_code VARCHAR := 'PROPRIETARY';\\012 dfl_stor_fmt_id TECH_ID;\\012BEGIN\\012 select cvte.id into dfl_stor_fmt_id from controlled_vocabulary_terms cvte, controlled_vocabularies cv \\012 where cvte.code = dfl_stor_fmt_code and cvte.covo_id = cv.id and cv.code = '.STORAGE_FORMAT'; \\012 update external_data set cvte_id_stor_fmt = dfl_stor_fmt_id;\\012 RETURN 1;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012SELECT polulate_external_data_cvte_id_stor_fmt();\\012DROP FUNCTION polulate_external_data_cvte_id_stor_fmt();\\012\\012-- Now that the field is populated, create the not null constraint for it.\\012\\012ALTER TABLE EXTERNAL_DATA ALTER COLUMN CVTE_ID_STOR_FMT SET NOT NULL;\\012\\012---------------------------------------------------------------------------------------------------\\012-- Purpose: Add and populate columns DATA_PRODUCER_CODE and PRODUCTION_TIMESTAMP to table DATA.\\012---------------------------------------------------------------------------------------------------\\012\\012ALTER TABLE DATA ADD COLUMN DATA_PRODUCER_CODE CODE;\\012ALTER TABLE DATA ADD COLUMN PRODUCTION_TIMESTAMP TIME_STAMP;\\012\\012CREATE OR REPLACE FUNCTION populate_data_producer_code_and_production_timestamp() RETURNS integer AS $$\\012DECLARE\\012 rec RECORD;\\012 loty_rel_code VARCHAR := 'RELATIVE_LOCATION';\\012 loty_rel_id TECH_ID;\\012 meas_ts TIMESTAMP;\\012 ds_code CODE;\\012 meas_ts_str TEXT;\\012BEGIN\\012 select id into loty_rel_id from locator_types where code = loty_rel_code; \\012 FOR rec IN SELECT d.id, ed.location FROM data d, external_data ed where d.id = ed.data_id and ed.loty_id = loty_rel_id LOOP\\012 meas_ts_str = substring(rec.location from '^.*/([0-9]{14})_[^_]+_(.*)$');\\012 ds_code := substring(rec.location from '^.*/[0-9]{14}_([^_]+)_(.*)$');\\012 IF meas_ts_str is not null and ds_code is not null THEN\\012 meas_ts := to_timestamp(meas_ts_str, 'YYYYMMDDHH24MISS');\\012 update data set production_timestamp=meas_ts, data_producer_code=ds_code where id=rec.id;\\012 END IF;\\012 END LOOP;\\012 RETURN 1;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012SELECT populate_data_producer_code_and_production_timestamp();\\012DROP FUNCTION populate_data_producer_code_and_production_timestamp();\\012\\012-- Rename columns\\012\\012ALTER TABLE DATA RENAME COLUMN PROC_ID_ACQUIRED_BY to PROC_ID_PRODUCED_BY;\\012\\012---------------------------------------------------------------------------------------------------\\012-- Purpose: Populate table DATA_SET_RELATIONSHIPS, by using heuristics.\\012---------------------------------------------------------------------------------------------------\\012\\012CREATE OR REPLACE FUNCTION abs_interval(ts1 time_stamp_dfl, ts2 time_stamp_dfl) returns interval AS $$\\012BEGIN\\012 IF ts1 < ts2 THEN\\012 RETURN ts2 - ts1;\\012 ELSE\\012 RETURN ts1 - ts2;\\012 END IF;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012CREATE OR REPLACE FUNCTION populate_data_set_relationships() RETURNS INTEGER AS $$\\012DECLARE\\012 source_id TECH_ID;\\012 rec_derived RECORD;\\012 rec_acquired RECORD;\\012 rel_location TEXT;\\012 data_set_code TEXT;\\012 data_set_code_trial TEXT;\\012 loty_rel_code TEXT := 'RELATIVE_LOCATION';\\012 loty_rel_id TECH_ID;\\012 count INTEGER := 0;\\012BEGIN\\012 select id into loty_rel_id from locator_types where code = loty_rel_code;\\012 FOR rec_derived IN select id, samp_id_derived_from, registration_timestamp from data where samp_id_derived_from is not null LOOP\\012 source_id := NULL;\\012 select location into rel_location from external_data where data_id = rec_derived.id and loty_id = loty_rel_id;\\012 IF rel_location is not null then\\012 data_set_code := substring(rel_location from '^.*/([0-9]{14}_[^_]+)_.*$');\\012 IF data_set_code is not null THEN\\012 FOR rec_acquired IN select id, samp_id_acquired_from from data where samp_id_acquired_from = rec_derived.samp_id_derived_from LOOP\\012 select location into rel_location from external_data where data_id = rec_acquired.id and loty_id = loty_rel_id;\\012 IF rel_location is not null THEN\\012 data_set_code_trial := substring(rel_location from '^.*/([0-9]{14}_[^_]+)_.*$');\\012 IF data_set_code_trial = data_set_code THEN\\012 source_id = rec_acquired.id;\\012 EXIT;\\012 END IF;\\012 END IF;\\012 END LOOP;\\012 END IF;\\012 END IF;\\012 -- If the location didn't tell us about data set relationships, try the backup strategy.\\012 IF source_id is null THEN\\012 -- Use the measured data set as source that is closest in registration timestamp.\\012 select id into source_id from data where samp_id_acquired_from = rec_derived.samp_id_derived_from \\012 and abs_interval(registration_timestamp, rec_derived.registration_timestamp) \\012 = (select min(abs_interval(registration_timestamp, rec_derived.registration_timestamp)) \\012 from data where samp_id_acquired_from = rec_derived.samp_id_derived_from);\\012 END IF;\\012 IF source_id is not null THEN\\012 insert into data_set_relationships (id, data_id_parent, data_id_child)\\012 values (nextval('DATA_SET_RELATIONSHIP_ID_SEQ'), source_id, rec_derived.id);\\012 count := count + 1;\\012 END IF;\\012 END LOOP;\\012 RETURN count;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012SELECT populate_data_set_relationships();\\012DROP FUNCTION populate_data_set_relationships();\\012DROP FUNCTION abs_interval(time_stamp_dfl, time_stamp_dfl);\\012\\012---------------------------------------------------------------------------------------------------\\012-- Purpose: Add column IS_MANAGED_INTERNALLY to table PROPERTY_TYPES. Internally managed \\012-- properties can not be assigned by users of openBIS, but only by the system. \\012---------------------------------------------------------------------------------------------------\\012\\012ALTER TABLE PROPERTY_TYPES ADD COLUMN IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F';\\012\\012-- Update already existing property type PLATE_GEOMETRY\\012update property_types set is_managed_internally = true, code = '.' || code where code = 'PLATE_GEOMETRY';\\012\\012-- Update already existing controlled vocabulary PLATE_GEOMETRY \\012update controlled_vocabularies set code = '.' || code where code = 'PLATE_GEOMETRY';\\012\\012---------------------------------------------------------------------------------------------------\\012-- Purpose: Add unique constraint on column LABEL. \\012---------------------------------------------------------------------------------------------------\\012\\012CREATE OR REPLACE FUNCTION make_prty_labels_unique() RETURNS INTEGER AS $$\\012DECLARE\\012 prev_key TEXT := NULL;\\012 this_key TEXT;\\012 dup_count INTEGER;\\012 cnt INTEGER := 0;\\012 already_exists INTEGER;\\012 new_label TEXT;\\012 this_id TECH_ID;\\012BEGIN\\012 FOR this_id, this_key IN select id, label from property_types order by label,id LOOP\\012 IF this_key = prev_key THEN\\012 dup_count := dup_count + 1;\\012 cnt := cnt + 1;\\012 ELSE\\012 dup_count := 0;\\012 END IF;\\012 IF dup_count > 0 THEN\\012 -- Check whether the new key already exists.\\012 LOOP\\012 new_label := this_key || '(' || dup_count::text || ')';\\012 select count(*) into already_exists from property_types where label = new_label;\\012 IF already_exists = 0 THEN\\012 EXIT;\\012 END IF;\\012 dup_count := dup_count + 1;\\012 END LOOP;\\012 update property_types set label = new_label where id = this_id;\\012 END IF;\\012 prev_key := this_key;\\012 END LOOP;\\012 RETURN cnt;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012SELECT make_prty_labels_unique();\\012DROP FUNCTION make_prty_labels_unique();\\012\\012ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_BK_UK_LBL UNIQUE(LABEL);\\012\\012-----------------------------------------------------------------------------------\\012-- Purpose: Add Controlled Vocabulary Terms to PLATE_GEOMETRY\\012-----------------------------------------------------------------------------------\\012\\012insert into controlled_vocabulary_terms \\012 ( id\\012 , code\\012 , covo_id \\012 , pers_id_registerer)\\012values (nextval('CVTE_ID_SEQ')\\012 , '96_WELLS_8X12'\\012 , (select id from controlled_vocabularies where code = '.PLATE_GEOMETRY')\\012 , (select id from persons where user_id = 'system'));\\012\\012insert into controlled_vocabulary_terms \\012 ( id\\012 , code\\012 , covo_id \\012 , pers_id_registerer)\\012values (nextval('CVTE_ID_SEQ')\\012 , '1536_WELLS_32X48'\\012 , (select id from controlled_vocabularies where code = '.PLATE_GEOMETRY')\\012 , (select id from persons where user_id = 'system'));\\012\\012\\012-----------------------------------------------------------------------------------\\012-- Purpose: Rename Observable Types: IMAGE -> HCS_IMAGE, IMAGE_ANALYSIS_DATA -> HCS_IMAGE_ANALYSIS_DATA\\012-- and descriptions accordingly\\012-----------------------------------------------------------------------------------\\012\\012update observable_types set code = 'HCS_IMAGE', description = 'Data derived from analysis of HCS images' where code = 'IMAGE';\\012update observable_types set code = 'HCS_IMAGE_ANALYSIS_DATA', description = 'Data derived from analysis of HCS images' where code = 'IMAGE_ANALYSIS_DATA';\\012\\012\\012-----------------------------------------------------------------------------------\\012-- Purpose: Make the assignments of property types DESCRIPTION, NUCLEOTIDE_SEQUENCE, OFFSET \\012-- and GENE_SYMBOL to material types internally managed. \\012-----------------------------------------------------------------------------------\\012\\012update material_type_property_types set is_managed_internally = true\\012 where prty_id in (select id from property_types where code = 'DESCRIPTION' \\012 or code = 'NUCLEOTIDE_SEQUENCE' or code = 'OFFSET' or code = 'GENE_SYMBOL');\\012\\012-----------------------------------------------------------------------------------\\012-- Purpose: Add column IS_DATA_ACQUISITION BOOLEAN_CHAR NOT NULL DEFAULT 'F' to table PROCEDURE_TYPES.\\012-----------------------------------------------------------------------------------\\012\\012ALTER TABLE PROCEDURE_TYPES ADD COLUMN IS_DATA_ACQUISITION BOOLEAN_CHAR NOT NULL DEFAULT 'F';\\012\\012-- Set the new attribute for procedure type DATA_ACQUISITION\\012update procedure_types set is_data_acquisition = true where code = 'DATA_ACQUISITION';\\012\\012-----------------------------------------------------------------------------------\\012-- Purpose: Convert all codes to upper case. \\012-----------------------------------------------------------------------------------\\012\\012CREATE OR REPLACE FUNCTION column_to_uppercase_fix_duplicates(tbl TEXT, clm TEXT) RETURNS INTEGER AS $$\\012DECLARE\\012 prev_key TEXT := NULL;\\012 this_key TEXT;\\012 dup_count INTEGER;\\012 count INTEGER := 0;\\012 already_exists INTEGER;\\012 new_clm TEXT;\\012BEGIN\\012 FOR this_key IN EXECUTE 'select ' || clm || ' from ' || tbl \\012 || ' order by upper(' || clm || '),id' LOOP\\012 IF upper(this_key) = upper(prev_key) THEN\\012 dup_count := dup_count + 1;\\012 count := count + 1;\\012 ELSE\\012 dup_count := 0;\\012 END IF;\\012 IF dup_count > 0 THEN\\012 -- Check whether the new key already exists.\\012 LOOP\\012 new_clm := this_key || '(' || dup_count::text || ')';\\012 EXECUTE 'select count(*) from ' || tbl \\012 || ' where upper(' || clm || ') = ' || quote_literal(upper(new_clm)) \\012 into already_exists;\\012 IF already_exists = 0 THEN\\012 EXIT;\\012 END IF;\\012 dup_count := dup_count + 1;\\012 END LOOP;\\012 EXECUTE 'update ' || tbl || ' set ' || clm || ' = ' || quote_literal(new_clm) || \\012 ' where ' || clm || ' = ' || quote_literal(this_key);\\012 END IF;\\012 prev_key := this_key;\\012 END LOOP;\\012 EXECUTE 'update ' || tbl || ' set ' || clm || ' = upper(' || clm || ')';\\012 RETURN count;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012\\012CREATE OR REPLACE FUNCTION column_to_uppercase_fix_duplicates(tbl TEXT, clm TEXT, clm2 TEXT) RETURNS INTEGER AS $$\\012DECLARE\\012 prev_key TEXT := NULL;\\012 prev_key2 TECH_ID;\\012 this_key TEXT;\\012 this_key2 TECH_ID;\\012 dup_count INTEGER;\\012 count INTEGER := 0;\\012 already_exists INTEGER;\\012 new_clm TEXT;\\012BEGIN\\012 FOR this_key, this_key2 IN EXECUTE 'select ' || clm || ',' || clm2 || ' from ' || tbl \\012 || ' order by ' || clm2 || ',upper(' || clm || '),id' LOOP\\012 IF upper(this_key) = upper(prev_key) and this_key2 = prev_key2 THEN\\012 dup_count := dup_count + 1;\\012 count := count + 1;\\012 ELSE\\012 dup_count := 0;\\012 END IF;\\012 IF dup_count > 0 THEN\\012 -- Check whether the new key already exists.\\012 LOOP\\012 new_clm := this_key || '(' || dup_count::text || ')';\\012 EXECUTE 'select count(*) from ' || tbl \\012 || ' where upper(' || clm || ') = ' || quote_literal(upper(new_clm)) \\012 || ' and ' || clm2 || ' = ' || quote_literal(this_key2) \\012 into already_exists;\\012 IF already_exists = 0 THEN\\012 EXIT;\\012 END IF;\\012 dup_count := dup_count + 1;\\012 END LOOP;\\012 EXECUTE 'update ' || tbl || ' set ' || clm || ' = ' || quote_literal(new_clm) || \\012 ' where ' || clm || ' = ' || quote_literal(this_key) || ' and ' \\012 || clm2 || ' = ' || quote_literal(this_key2);\\012 END IF;\\012 prev_key := this_key;\\012 prev_key2 := this_key2;\\012 END LOOP;\\012 EXECUTE 'update ' || tbl || ' set ' || clm || ' = upper(' || clm || ')';\\012 RETURN count;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012\\012SELECT column_to_uppercase_fix_duplicates('samples', 'code');\\012SELECT column_to_uppercase_fix_duplicates('property_types', 'code');\\012SELECT column_to_uppercase_fix_duplicates('controlled_vocabularies', 'code');\\012\\012SELECT column_to_uppercase_fix_duplicates('projects', 'code', 'grou_id');\\012SELECT column_to_uppercase_fix_duplicates('experiments', 'code', 'proj_id');\\012SELECT column_to_uppercase_fix_duplicates('controlled_vocabulary_terms', 'code', 'covo_id');\\012SELECT column_to_uppercase_fix_duplicates('materials', 'code', 'maty_id');\\012SELECT column_to_uppercase_fix_duplicates('material_batches', 'code', 'mate_id');\\012SELECT column_to_uppercase_fix_duplicates('sample_components', 'code', 'samp_id');\\012\\012-- These will only need changes if someone entered them through the 'back door' directly on the server.\\012\\012SELECT column_to_uppercase_fix_duplicates('groups', 'code');\\012SELECT column_to_uppercase_fix_duplicates('sample_types', 'code');\\012SELECT column_to_uppercase_fix_duplicates('material_types', 'code');\\012SELECT column_to_uppercase_fix_duplicates('experiment_types', 'code');\\012SELECT column_to_uppercase_fix_duplicates('procedure_types', 'code');\\012SELECT column_to_uppercase_fix_duplicates('observable_types', 'code');\\012SELECT column_to_uppercase_fix_duplicates('locator_types', 'code');\\012SELECT column_to_uppercase_fix_duplicates('file_format_types', 'code');\\012SELECT column_to_uppercase_fix_duplicates('data_types', 'code');\\012\\012DROP FUNCTION column_to_uppercase_fix_duplicates(TEXT, TEXT);\\012DROP FUNCTION column_to_uppercase_fix_duplicates(TEXT, TEXT, TEXT);\\012\\012-----------------------------------------------------------------------------------\\012-- Purpose: Delete sample_components with no associated material_batches.\\012-- This deletes superfluous controls of master plates\\012-----------------------------------------------------------------------------------\\012\\012delete from sample_components\\012where id in (select sc.id \\012 from sample_components as sc left join sample_component_materials as scm \\012 on scm.saco_id = sc.id \\012 where scm.saco_id is null\\012 )\\012;\\012 \N 017 source/sql/postgresql/migration/migration-016-017.sql SUCCESS 2008-05-09 10:12:57.473 ----------------------------------------------------------------------------------------------\\012-- File: migration-016-017.sql\\012--\\012-- \\012-- This script enables the migration of the database schema from 016 to 017.\\012-- \\012-- Update History\\012--\\012--\\012--\\011Who\\011\\011\\011 When\\011\\011 What\\012--\\011---\\011\\011\\011 ---- \\011----\\012--\\011Charles Ramin-Wright\\0112008-04-11\\011Initial Version \\012-- \\012----------------------------------------------------------------------------------------------\\012\\012\\012--=================================\\012-- Create Objects\\012--=================================\\012\\012-- Domains\\012\\012-- 'F' is false, 'T' is true and 'U' is unknown\\012CREATE DOMAIN BOOLEAN_CHAR_OR_UNKNOWN AS CHAR(1) CHECK (VALUE in ('F', 'T', 'U'));\\012\\012-- Tables and related objects\\012\\012-- Sequences\\012\\012-- Indices\\012\\012--====================================\\012-- Delete Objects\\012--====================================\\012\\012-- Domains\\012\\012-- Tables\\012\\012-- Sequences\\012\\012-- Indices\\012\\012--====================================\\012-- Alter Objects\\012--====================================\\012\\012-- Add column IS_INTERNAL_NAMESPACE to table CONTROLLED_VOCABULARIES \\012\\012ALTER TABLE CONTROLLED_VOCABULARIES ADD IS_INTERNAL_NAMESPACE BOOLEAN_CHAR NOT NULL DEFAULT 'F';\\012\\012-- Add column IS_INTERNAL_NAMESPACE to table PROPERTY_TYPES \\012\\012ALTER TABLE PROPERTY_TYPES ADD IS_INTERNAL_NAMESPACE BOOLEAN_CHAR NOT NULL DEFAULT 'F';\\012\\012-- Add column IS_INTERNAL_NAMESPACE as key component to the unique key constraint COVO_BK_UK\\012\\012ALTER TABLE CONTROLLED_VOCABULARIES DROP CONSTRAINT COVO_BK_UK;\\012ALTER TABLE CONTROLLED_VOCABULARIES ADD CONSTRAINT COVO_BK_UK UNIQUE(CODE,IS_INTERNAL_NAMESPACE);\\012\\012-- Add column IS_INTERNAL_NAMESPACE as key component to the unique key constraint PRTY_BK_UK\\012\\012ALTER TABLE PROPERTY_TYPES DROP CONSTRAINT PRTY_BK_UK;\\012ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_BK_UK UNIQUE(CODE,IS_INTERNAL_NAMESPACE);\\012\\012-- Delete unique key constraint PRTY_BK_UK_LBL (which was for column LABEL) from table PROPERTY_TYPES\\012\\012ALTER TABLE PROPERTY_TYPES DROP CONSTRAINT PRTY_BK_UK_LBL;\\012\\012\\012-- Change unique constraint EXDA_BK_UK to contain EXTERNAL_DATA.LOTY_ID \\012\\012ALTER TABLE EXTERNAL_DATA DROP CONSTRAINT EXDA_BK_UK;\\012ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_BK_UK UNIQUE(LOCATION,LOTY_ID);\\012\\012\\012-- Increase length of EXTERNAL_DATA.LOCATION from 200 to 1024\\012\\012ALTER TABLE EXTERNAL_DATA ALTER COLUMN LOCATION TYPE VARCHAR(1024);\\012\\012\\012-- Add column IS_COMPLETE to table EXTERNAL_DATA\\012\\012ALTER TABLE EXTERNAL_DATA ADD COLUMN IS_COMPLETE BOOLEAN_CHAR_OR_UNKNOWN NOT NULL DEFAULT 'U';\\012\\012\\012--=================================\\012-- Replace EXTERNAL_DATA_STORAGE_FORMAT_CHECK() function\\012--=================================\\012\\012CREATE OR REPLACE FUNCTION EXTERNAL_DATA_STORAGE_FORMAT_CHECK() RETURNS trigger AS $$\\012DECLARE\\012 v_covo_code CODE;\\012 data_code CODE;\\012BEGIN\\012\\012 select code into v_covo_code from controlled_vocabularies\\012 where is_internal_namespace = true and \\012 id = (select covo_id from controlled_vocabulary_terms where id = NEW.cvte_id_stor_fmt);\\012\\012-- Check if the data storage format is a term of the controlled vocabulary "STORAGE_FORMAT"\\012 if v_covo_code != 'STORAGE_FORMAT' then\\012 select code into data_code from data where id = NEW.data_id; \\012 RAISE EXCEPTION 'Insert/Update of Data (Code: %) failed, as its Storage Format is %, but is required to be STORAGE_FORMAT.', data_code, v_covo_code;\\012 end if;\\012\\012 RETURN NEW;\\012\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012\\012--=================================\\012-- Data Migration\\012--=================================\\012\\012\\012---------------------------------------------------------------------------------------\\012-- Translate the internally managed CODES which are represented by the Dot-Prefix to:\\012--\\012-- CODE without a Dot-Prefix plus the new column IS_INTERNAL_NAMESPACE = true.\\012---------------------------------------------------------------------------------------\\012\\012UPDATE property_types\\012SET code = substr(code,2,length(code))\\012 , is_internal_namespace = true \\012WHERE substr(code,1,1) = '.';\\012\\012UPDATE controlled_vocabularies\\012SET code = substr(code,2,length(code))\\012 , is_internal_namespace = true \\012WHERE substr(code,1,1) = '.';\\012\\012------------------------------------------------------------------------------------\\012-- Purpose: Move experiment descriptions from column to property DESCRIPTION\\012------------------------------------------------------------------------------------\\012\\012 -----------------------\\012 -- Material Type SIRNHACS\\012 -----------------------\\012\\012insert into experiment_type_property_types\\012( id\\012 ,exty_id\\012 ,prty_id\\012 ,is_mandatory\\012 ,is_managed_internally\\012 ,pers_id_registerer\\012 )\\012values \\012( nextval('ETPT_ID_SEQ')\\012 ,(select id from experiment_types where code = 'SIRNAHCS')\\012 ,(select id from property_types where code = 'DESCRIPTION')\\012 ,true\\012 ,true\\012 ,(select id from persons where user_id ='system')\\012);\\012\\012-- Add experiment_properties for descriptions of all experiments of type SIRNAHCS \\012\\012insert into experiment_properties\\012( id\\012 ,expe_id\\012 ,value\\012 ,etpt_id\\012 ,pers_id_registerer\\012)\\012select\\012 nextval('EXPERIMENT_PROPERTY_ID_SEQ')\\012 ,id\\012 ,case when description is not null then description else 'No description given' end\\012 ,currval('ETPT_ID_SEQ')\\012 ,(select id from persons where user_id ='system') \\012from experiments where exty_id = (select id from experiment_types where code = 'SIRNAHCS');\\012\\012-- Finally: drop column\\012\\012ALTER TABLE EXPERIMENTS DROP COLUMN DESCRIPTION;\\012 \N 018 source/sql/postgresql/migration/migration-017-018.sql SUCCESS 2008-05-09 10:12:57.646 ----------------------------------------------------------------------------------------------\\012-- File: migration-017-018.sql\\012--\\012-- \\012-- This script enables the migration of the database schema from 016 to 017.\\012-- \\012----------------------------------------------------------------------------------------------\\012\\012\\012--=================================\\012-- Create Objects\\012--=================================\\012\\012-- Domains\\012\\012-- Tables and related objects\\012\\012-- Sequences\\012\\012-- Indices\\012\\012--====================================\\012-- Delete Objects\\012--====================================\\012\\012-- Domains\\012\\012-- Tables\\012\\012-- Sequences\\012\\012-- Indices\\012\\012--====================================\\012-- Alter Objects\\012--====================================\\012\\012\\012--=================================\\012-- Data Migration\\012--=================================\\012\\012-------------------------------------------------------------------------\\012-- Purpose: Insert a new EXPERIMENT_TYPE called 'COMPOUND_HCS'\\012--------------------------------------------------------------------------\\012\\012insert into experiment_types\\012(id\\012,code\\012,description)\\012values \\012(nextval('EXPERIMENT_TYPE_ID_SEQ')\\012,'COMPOUND_HCS'\\012,'Compound High Content Screening'\\012);\\012\\012\\012-------------------------------------------------------------------------\\012-- Purpose: Link a mandatory DESCRIPTION to the new EXPERIMENT_TYPE \\012-- called 'COMPOUND_HCS'\\012--------------------------------------------------------------------------\\012\\012insert into experiment_type_property_types\\012( id\\012 ,exty_id\\012 ,prty_id\\012 ,is_mandatory\\012 ,is_managed_internally\\012 ,pers_id_registerer\\012 )\\012values \\012 (nextval('ETPT_ID_SEQ')\\012 ,(select id from experiment_types where code = 'COMPOUND_HCS')\\012 ,(select id from property_types where code = 'DESCRIPTION' and is_internal_namespace = false)\\012 ,true\\012 ,true\\012 ,(select id from persons where user_id ='system')\\012);\\012\\012\\012-------------------------------------------------------------------------\\012-- Purpose: Change EXPERIMENT_TYPE CODE 'SIRNAHCS' to 'SIRNA_HCS'\\012--------------------------------------------------------------------------\\012\\012update experiment_types\\012set code = 'SIRNA_HCS'\\012where code = 'SIRNAHCS'\\012;\\012\\012 \N -019 ../openbis/source/sql/postgresql/migration/migration-018-019.sql SUCCESS 2008-09-26 15:35:31.207 ----------------------------------------------------------------------------------------------\\012-- File: migration-018-019.sql\\012--\\012-- \\012-- This script enables the migration of the database schema from 018 to 019.\\012-- \\012----------------------------------------------------------------------------------------------\\012\\012\\012\\012--=================================\\012-- Create New Objects\\012--=================================\\012\\012-- Domains\\012\\012CREATE DOMAIN DESCRIPTION_1000 AS VARCHAR(1000);\\012CREATE DOMAIN AUTHORIZATION_ROLE as CODE CHECK (VALUE IN ('ADMIN', 'USER', 'OBSERVER', 'ETL_SERVER')) NOT NULL;\\012\\012\\012-- Tables\\012\\012CREATE TABLE DATABASE_INSTANCES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,IS_ORIGINAL_SOURCE BOOLEAN_CHAR NOT NULL DEFAULT 'F',REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP);\\012CREATE TABLE ROLE_ASSIGNMENTS (ID TECH_ID NOT NULL,ROLE_CODE AUTHORIZATION_ROLE,GROU_ID TECH_ID,DBIN_ID TECH_ID,PERS_ID_GRANTEE TECH_ID NOT NULL,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP);\\012\\012-- Columns \\012\\012-- Create the new DBIN_ID columns initially as NULLable!\\012\\012ALTER TABLE CONTROLLED_VOCABULARIES ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE EXPERIMENT_TYPES ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE EXPERIMENTS ADD COLUMN DESCRIPTION DESCRIPTION_250;\\012ALTER TABLE EXPERIMENTS ADD COLUMN IS_PUBLIC BOOLEAN_CHAR NOT NULL DEFAULT 'F';\\012ALTER TABLE FILE_FORMAT_TYPES ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE GROUPS ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE GROUPS ADD COLUMN GROU_ID_PARENT TECH_ID;\\012ALTER TABLE GROUPS ADD COLUMN PERS_ID_LEADER TECH_ID;\\012ALTER TABLE GROUPS ADD COLUMN DESCRIPTION DESCRIPTION_250;\\012ALTER TABLE GROUPS ADD COLUMN REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP;\\012ALTER TABLE GROUPS ADD COLUMN PERS_ID_REGISTERER TECH_ID;\\012ALTER TABLE MATERIALS ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE MATERIAL_TYPES ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE OBSERVABLE_TYPES ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE PERSONS ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE PERSONS ADD COLUMN PERS_ID_REGISTERER TECH_ID;\\012ALTER TABLE PERSONS ADD COLUMN REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP;\\012ALTER TABLE PROCEDURE_TYPES ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE PROJECTS ADD COLUMN PERS_ID_LEADER TECH_ID;\\012ALTER TABLE PROJECTS ADD COLUMN PERS_ID_REGISTERER TECH_ID;\\012ALTER TABLE PROJECTS ADD COLUMN REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP;\\012ALTER TABLE PROJECTS ADD COLUMN DESCRIPTION DESCRIPTION_1000;\\012ALTER TABLE PROPERTY_TYPES ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE SAMPLES ADD COLUMN DBIN_ID TECH_ID ;\\012ALTER TABLE SAMPLES ADD COLUMN GROU_ID TECH_ID ;\\012ALTER TABLE SAMPLE_TYPES ADD COLUMN DBIN_ID TECH_ID;\\012\\012\\012-- Primary Key Constraints\\012\\012ALTER TABLE DATABASE_INSTANCES ADD CONSTRAINT DBIN_PK PRIMARY KEY(ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_PK PRIMARY KEY(ID);\\012\\012-- Unique Key Constraints\\012\\012ALTER TABLE DATABASE_INSTANCES ADD CONSTRAINT DBIN_BK_UK UNIQUE(CODE);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_BK_UK UNIQUE(PERS_ID_GRANTEE,ROLE_CODE,GROU_ID,DBIN_ID);\\012\\012-- Foreign Key Constraints\\012\\012ALTER TABLE CONTROLLED_VOCABULARIES ADD CONSTRAINT COVO_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE EXPERIMENT_TYPES ADD CONSTRAINT EXTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE FILE_FORMAT_TYPES ADD CONSTRAINT FFTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE GROUPS ADD CONSTRAINT GROU_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE GROUPS ADD CONSTRAINT GROU_GROU_FK FOREIGN KEY (GROU_ID_PARENT) REFERENCES GROUPS(ID);\\012ALTER TABLE GROUPS ADD CONSTRAINT GROU_PERS_FK_LEADER FOREIGN KEY (PERS_ID_LEADER) REFERENCES PERSONS(ID);\\012ALTER TABLE GROUPS ADD CONSTRAINT GROU_PERS_FK_REGISTERER FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE MATERIALS ADD CONSTRAINT MATE_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE MATERIAL_TYPES ADD CONSTRAINT MATY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE OBSERVABLE_TYPES ADD CONSTRAINT OBTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE PERSONS ADD CONSTRAINT PERS_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE PROCEDURE_TYPES ADD CONSTRAINT PCTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE PROJECTS ADD CONSTRAINT PROJ_PERS_FK_LEADER FOREIGN KEY (PERS_ID_LEADER) REFERENCES PERSONS(ID);\\012ALTER TABLE PROJECTS ADD CONSTRAINT PROJ_PERS_FK_REGISTERER FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_GROU_FK FOREIGN KEY (GROU_ID) REFERENCES GROUPS(ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_PERS_FK_GRANTEE FOREIGN KEY (PERS_ID_GRANTEE) REFERENCES PERSONS(ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_PERS_FK_REGISTERER FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_GROU_FK FOREIGN KEY (GROU_ID) REFERENCES GROUPS(ID);\\012ALTER TABLE SAMPLE_TYPES ADD CONSTRAINT SATY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012\\012\\012-- Sequences\\012\\012CREATE SEQUENCE DATABASE_INSTANCE_ID_SEQ;\\012CREATE SEQUENCE ROLE_ASSIGNMENT_ID_SEQ;\\012\\012-- Indices\\012\\012CREATE INDEX EXDA_CVTE_FK_I ON EXTERNAL_DATA (CVTE_ID_STOR_FMT);\\012CREATE INDEX GROU_DBIN_FK_I ON GROUPS (DBIN_ID);\\012CREATE INDEX GROU_GROU_FK_I ON GROUPS (GROU_ID_PARENT);\\012CREATE INDEX GROU_PERS_FK_I ON GROUPS (PERS_ID_LEADER);\\012CREATE INDEX GROU_PERS_REGISTERED_BY_FK_I ON GROUPS (PERS_ID_REGISTERER);\\012CREATE INDEX PROJ_PERS_FK_I_LEADER ON PROJECTS (PERS_ID_LEADER);\\012CREATE INDEX PROJ_PERS_FK_I_REGISTERER ON PROJECTS (PERS_ID_REGISTERER);\\012CREATE INDEX ROAS_DBIN_FK_I ON ROLE_ASSIGNMENTS (DBIN_ID);\\012CREATE INDEX ROAS_GROU_FK_I ON ROLE_ASSIGNMENTS (GROU_ID);\\012CREATE INDEX ROAS_PERS_FK_I_GRANTEE ON ROLE_ASSIGNMENTS (PERS_ID_GRANTEE);\\012CREATE INDEX ROAS_PERS_FK_I_REGISTERER ON ROLE_ASSIGNMENTS (PERS_ID_REGISTERER);\\012\\012\\012--====================================\\012-- Alter Objects\\012--====================================\\012\\012-- Domains\\012\\012ALTER DOMAIN BOOLEAN_CHAR_OR_UNKNOWN SET DEFAULT 'U';\\012\\012-- Tables\\012\\012ALTER TABLE PERSONS ALTER COLUMN USER_ID SET NOT NULL;\\012\\012-- Primary Key Constraints\\012\\012\\012-- Unique Key Constraints\\012\\012 -- Drop the Unique Key Constraints\\012ALTER TABLE CONTROLLED_VOCABULARIES DROP CONSTRAINT COVO_BK_UK ;\\012ALTER TABLE EXPERIMENT_TYPES DROP CONSTRAINT EXTY_BK_UK ;\\012ALTER TABLE FILE_FORMAT_TYPES DROP CONSTRAINT FFTY_BK_UK ;\\012ALTER TABLE GROUPS DROP CONSTRAINT GROU_BK_UK ;\\012ALTER TABLE MATERIALS DROP CONSTRAINT MATE_BK_UK ;\\012ALTER TABLE MATERIAL_TYPES DROP CONSTRAINT MATY_BK_UK ;\\012ALTER TABLE OBSERVABLE_TYPES DROP CONSTRAINT OBTY_BK_UK ;\\012ALTER TABLE PERSONS DROP CONSTRAINT PERS_BK_UK ;\\012ALTER TABLE PROCEDURE_TYPES DROP CONSTRAINT PCTY_BK_UK ;\\012ALTER TABLE PROPERTY_TYPES DROP CONSTRAINT PRTY_BK_UK ;\\012ALTER TABLE ROLE_ASSIGNMENTS DROP CONSTRAINT ROAS_BK_UK ;\\012ALTER TABLE SAMPLES DROP CONSTRAINT SAMP_BK_UK ;\\012ALTER TABLE SAMPLE_TYPES DROP CONSTRAINT SATY_BK_UK ;\\012\\012-- There was a bug in migration - the constraint was not created. So we drop it only if it exists.\\012create function remove_maty_uk_constraint() returns void AS $$\\012begin\\012 perform *\\012 FROM information_schema.table_constraints WHERE constraint_name='MATY_UK';\\012 if found\\012 then\\012\\011ALTER TABLE MATERIAL_TYPES DROP CONSTRAINT MATY_UK ;\\012 end if;\\012end;\\012$$ language 'plpgsql';\\012select remove_maty_uk_constraint();\\012drop function remove_maty_uk_constraint();\\012\\012 -- ReCreate the Unique Key Constraints with the extended columns\\012ALTER TABLE CONTROLLED_VOCABULARIES ADD CONSTRAINT COVO_BK_UK UNIQUE(CODE,IS_INTERNAL_NAMESPACE,DBIN_ID);\\012ALTER TABLE EXPERIMENT_TYPES ADD CONSTRAINT EXTY_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE FILE_FORMAT_TYPES ADD CONSTRAINT FFTY_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE GROUPS ADD CONSTRAINT GROU_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE MATERIALS ADD CONSTRAINT MATE_BK_UK UNIQUE(CODE,MATY_ID,DBIN_ID);\\012ALTER TABLE MATERIAL_TYPES ADD CONSTRAINT MATY_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE OBSERVABLE_TYPES ADD CONSTRAINT OBTY_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE PERSONS ADD CONSTRAINT PERS_BK_UK UNIQUE(DBIN_ID,USER_ID);\\012ALTER TABLE PROCEDURE_TYPES ADD CONSTRAINT PCTY_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_BK_UK UNIQUE(CODE,IS_INTERNAL_NAMESPACE,DBIN_ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_BK_UK UNIQUE(PERS_ID_GRANTEE,ROLE_CODE,GROU_ID,DBIN_ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_BK_UK UNIQUE(CODE,DBIN_ID,GROU_ID);\\012ALTER TABLE SAMPLE_TYPES ADD CONSTRAINT SATY_BK_UK UNIQUE(CODE,DBIN_ID);\\012\\012\\012\\012-- Foreign Key Constraints\\012\\012 -- Rename according to the naming convention\\012ALTER TABLE EXTERNAL_DATA DROP CONSTRAINT EXDA_STOR_FMT_FK;\\012ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_CVTE_FK FOREIGN KEY (CVTE_ID_STOR_FMT) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID);\\012\\012\\012-- Check Constraints\\012\\012-- Indexes\\012\\012 -- Rename according to the naming convention\\012DROP INDEX DATA_SAMP_DERIVED_FROM_FK_I ;\\012DROP INDEX DATA_SAMP_FK_I ;\\012CREATE INDEX DATA_SAMP_FK_I_ACQUIRED_FROM ON DATA (SAMP_ID_ACQUIRED_FROM);\\012CREATE INDEX DATA_SAMP_FK_I_DERIVED_FROM ON DATA (SAMP_ID_DERIVED_FROM);\\012\\012\\012\\012\\012--====================================\\012-- Delete Objects\\012--====================================\\012\\012-- Domains\\012\\012DROP DOMAIN DOUBLE_PRECISION_VALUE;\\012\\012-- Tables\\012\\012-- Sequences\\012\\012-- Indices\\012\\012\\012--=================================\\012-- Data Migration\\012--=================================\\012\\012INSERT INTO database_instances(\\012 id\\012 , code\\012 , is_original_source)\\012 VALUES ( nextval('DATABASE_INSTANCE_ID_SEQ')\\012 , 'SYSTEM_DEFAULT'\\012 , 'T');\\012\\012\\012-----------------------------------------------------------------------------------\\012-- Fill the FK column in all tables that reference the DATABASE_INSTANCES table\\012-----------------------------------------------------------------------------------\\012\\012update CONTROLLED_VOCABULARIES \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update EXPERIMENT_TYPES \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update FILE_FORMAT_TYPES \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update GROUPS \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update MATERIALS \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update MATERIAL_TYPES \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update OBSERVABLE_TYPES \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update PERSONS \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update PROCEDURE_TYPES \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update PROPERTY_TYPES \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update SAMPLES \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update SAMPLE_TYPES \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012\\012-----------------------------------------------------------------------------------\\012-- Fill the FK column in all tables that newly reference the PERSONS table\\012-----------------------------------------------------------------------------------\\012\\012update GROUPS \\012set PERS_ID_REGISTERER = (select id from persons where user_id = 'system');\\012\\012\\012\\012\\012-- Columns \\012\\012-- Change certain new columns to possess the NOT NULL constraint\\012\\012ALTER TABLE CONTROLLED_VOCABULARIES ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE EXPERIMENT_TYPES ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE FILE_FORMAT_TYPES ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE GROUPS ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE GROUPS ALTER COLUMN PERS_ID_REGISTERER SET NOT NULL;\\012ALTER TABLE MATERIALS ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE MATERIAL_TYPES ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE OBSERVABLE_TYPES ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE PERSONS ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE PROCEDURE_TYPES ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE PROPERTY_TYPES ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE SAMPLE_TYPES ALTER COLUMN DBIN_ID SET NOT NULL;\\012\\012-- Check Constraints\\012\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_DBIN_GROU_ARC_CK CHECK ((DBIN_ID IS NOT NULL AND GROU_ID IS NULL) OR (DBIN_ID IS NULL AND GROU_ID IS NOT NULL));\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_DBIN_GROU_ARC_CK CHECK ((DBIN_ID IS NOT NULL AND GROU_ID IS NULL) OR (DBIN_ID IS NULL AND GROU_ID IS NOT NULL));\\012 \N -020 ../openbis/source/sql/postgresql/migration/migration-019-020.sql SUCCESS 2008-09-26 15:35:31.429 -- migration-019-020.sql\\012\\012\\012-- Creating domains\\012\\012--------\\012-- Added\\012--------\\012\\012CREATE DOMAIN EVENT_TYPE AS VARCHAR(40) CHECK (VALUE IN ('DELETION', 'INVALIDATION', 'MOVEMENT'));\\012\\012----------\\012-- Changed\\012----------\\012\\012-- Change the domain AUTHORIZATION_ROLE by changing its TYPE to VARCHAR(40) and dropping the NOT NULL constraint\\012\\012ALTER TABLE ROLE_ASSIGNMENTS ALTER COLUMN ROLE_CODE TYPE CODE;\\012DROP DOMAIN AUTHORIZATION_ROLE;\\012CREATE DOMAIN AUTHORIZATION_ROLE AS VARCHAR(40) CHECK (VALUE IN ('ADMIN', 'USER', 'OBSERVER', 'ETL_SERVER')) ;\\012ALTER TABLE ROLE_ASSIGNMENTS ALTER COLUMN ROLE_CODE TYPE AUTHORIZATION_ROLE;\\012\\012\\012-- Creating tables\\012\\012--------\\012-- Added\\012--------\\012\\012CREATE TABLE EVENTS (ID TECH_ID NOT NULL,EVENT_TYPE EVENT_TYPE NOT NULL,DATA_ID TECH_ID,DESCRIPTION DESCRIPTION_250,REASON DESCRIPTION_250,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP);\\012\\012----------\\012-- Changed\\012----------\\012\\012ALTER TABLE DATA ADD COLUMN IS_DELETED BOOLEAN_CHAR DEFAULT 'F';\\012ALTER TABLE DATA ADD COLUMN IS_VALID BOOLEAN_CHAR DEFAULT 'T';\\012\\012ALTER TABLE EXTERNAL_DATA ADD COLUMN CVTE_ID_STORE TECH_ID;\\012\\012ALTER TABLE PERSONS ADD COLUMN GROU_ID TECH_ID;\\012\\012ALTER TABLE ROLE_ASSIGNMENTS ALTER COLUMN ROLE_CODE SET NOT NULL;\\012\\012UPDATE EXPERIMENTS SET PERS_ID_REGISTERER = (SELECT ID FROM PERSONS WHERE USER_ID ='system') WHERE PERS_ID_REGISTERER IS NULL;\\012ALTER TABLE EXPERIMENTS ALTER COLUMN PERS_ID_REGISTERER SET NOT NULL;\\012\\012UPDATE PROJECTS SET PERS_ID_REGISTERER = (SELECT ID FROM PERSONS WHERE USER_ID ='system') WHERE PERS_ID_REGISTERER IS NULL;\\012ALTER TABLE PROJECTS ALTER COLUMN PERS_ID_REGISTERER SET NOT NULL;\\012\\012UPDATE PERSONS SET GROU_ID = (SELECT ID FROM GROUPS LIMIT 1);\\012\\012-- Creating sequences\\012\\012--------\\012-- Added\\012--------\\012\\012CREATE SEQUENCE EVENT_ID_SEQ;\\012\\012\\012-- Creating primary key constraints\\012\\012--------\\012-- Added\\012--------\\012\\012ALTER TABLE EVENTS ADD CONSTRAINT EVNT_PK PRIMARY KEY(ID);\\012\\012\\012-- Creating unique constraints\\012\\012ALTER TABLE EVENTS ADD CONSTRAINT EVNT_BK_UK UNIQUE(EVENT_TYPE,DATA_ID);\\012\\012----------\\012-- Changed\\012----------\\012\\012ALTER TABLE ROLE_ASSIGNMENTS DROP CONSTRAINT ROAS_BK_UK ;\\012\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_BK_UK UNIQUE(PERS_ID_GRANTEE,ROLE_CODE,GROU_ID,DBIN_ID);\\012\\012\\012-- Creating foreign key constraints\\012\\012--------\\012-- Added\\012--------\\012\\012ALTER TABLE EVENTS ADD CONSTRAINT EVNT_DATA_FK FOREIGN KEY (DATA_ID) REFERENCES DATA(ID);\\012ALTER TABLE EVENTS ADD CONSTRAINT EVNT_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_CVTE_STORED_ON_FK FOREIGN KEY (CVTE_ID_STORE) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID);\\012ALTER TABLE PERSONS ADD CONSTRAINT PERS_GROU_FK FOREIGN KEY (GROU_ID) REFERENCES GROUPS(ID);\\012\\012\\012\\012-- Creating check constraints\\012\\012\\012-- Creating indices\\012\\012--------\\012-- Added\\012--------\\012\\012CREATE INDEX EVNT_DATA_FK_I ON EVENTS (DATA_ID);\\012CREATE INDEX EVNT_PERS_FK_I ON EVENTS (PERS_ID_REGISTERER);\\012CREATE INDEX EXDA_CVTE_STORED_ON_FK_I ON EXTERNAL_DATA (CVTE_ID_STORE);\\012CREATE INDEX PERS_GROU_FK_I ON PERSONS (GROU_ID);\\012 \N -021 ../openbis/source/sql/postgresql/migration/migration-020-021.sql SUCCESS 2008-09-26 15:35:31.475 ------------------------\\012-- migration-020-021.sql\\012------------------------\\012\\012-- Translate the AUTHORIZATION_ROLE value ADMIN to 'INSTANCE_ADMIN' and 'GROUP_ADMIN' \\012\\012ALTER DOMAIN AUTHORIZATION_ROLE DROP CONSTRAINT AUTHORIZATION_ROLE_CHECK;\\012ALTER DOMAIN AUTHORIZATION_ROLE ADD CONSTRAINT AUTHORIZATION_ROLE_CHECK CHECK (VALUE IN ('ADMIN', 'USER', 'OBSERVER', 'ETL_SERVER'));\\012\\012-- Modify the UK of the SAMPLES table\\012\\012ALTER TABLE SAMPLES DROP CONSTRAINT SAMP_BK_UK;\\012\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_BK_DBIN_UK UNIQUE(SATY_ID,CODE,DBIN_ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_BK_GROU_UK UNIQUE(SATY_ID,CODE,GROU_ID);\\012\\012\\012 \N -022 ../openbis/source/sql/postgresql/migration/migration-021-022.sql SUCCESS 2008-09-26 15:35:31.559 -- Drop the UKs SAMP_BK_DBIN_UK and SAMP_BK_GROU_UK of the SAMPLES table\\012\\012ALTER TABLE SAMPLES DROP CONSTRAINT SAMP_BK_DBIN_UK;\\012ALTER TABLE SAMPLES DROP CONSTRAINT SAMP_BK_GROU_UK;\\012\\012-- Recreate the UKs SAMP_BK_DBIN_UK and SAMP_BK_GROU_UK of the SAMPLES table, but without the SATY_ID column.\\012\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_BK_DBIN_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_BK_GROU_UK UNIQUE(CODE,GROU_ID);\\012 \N -023 ../openbis/source/sql/postgresql/migration/migration-022-023.sql SUCCESS 2008-09-26 15:35:36.634 -- JAVA ch.systemsx.cisd.openbis.generic.server.dataaccess.migration.MigrationStepFrom022To023\\012\\012-- Add column GLOBAL_CODE to the DATABASE_INSTANCES table.\\012-- Set it's value from the code, it will be updated later from java.\\012\\012ALTER TABLE DATABASE_INSTANCES ADD COLUMN GLOBAL_CODE CODE;\\012update DATABASE_INSTANCES set GLOBAL_CODE = CODE;\\012ALTER TABLE DATABASE_INSTANCES ADD CONSTRAINT DBIN_GLOBAL_CODE_UK UNIQUE(GLOBAL_CODE);\\012ALTER TABLE DATABASE_INSTANCES alter column GLOBAL_CODE set NOT NULL;\\012\\012-- Add column the new FK column SAMP_ID_PART_OF of the SAMPLES table\\012\\012ALTER TABLE SAMPLES ADD COLUMN SAMP_ID_PART_OF TECH_ID;\\012\\012-- Drop constraint SAMP_BK_DBIN_UK of SAMPLES table\\012\\012ALTER TABLE SAMPLES DROP CONSTRAINT SAMP_BK_DBIN_UK;\\012\\012-- Drop constraint SAMP_BK_GROU_UK of SAMPLES table\\012\\012ALTER TABLE SAMPLES DROP CONSTRAINT SAMP_BK_GROU_UK;\\012\\012-- Add FK PART_OF to the SAMPLES table\\012\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_SAMP_FK_PART_OF FOREIGN KEY (SAMP_ID_PART_OF) REFERENCES SAMPLES(ID);\\012\\012-- Add Index for the FK Part Of of the SAMPLES table\\012CREATE INDEX SAMP_SAMP_FK_I_PART_OF ON SAMPLES (SAMP_ID_PART_OF);\\012\\012-- Create the SAMPLE_MATERIAL_BATCHES table\\012\\012CREATE TABLE SAMPLE_MATERIAL_BATCHES (ID TECH_ID NOT NULL,SAMP_ID TECH_ID NOT NULL,MABA_ID TECH_ID NOT NULL);\\012ALTER TABLE SAMPLE_MATERIAL_BATCHES ADD CONSTRAINT SAMB_PK PRIMARY KEY(ID);\\012\\012-- Create the sequence for the SAMPLE_MATERIAL_BATCHES table\\012\\012CREATE SEQUENCE SAMPLE_MATERIAL_BATCH_ID_SEQ;\\012\\012\\012-- Create WELL as a new SAMPLE_TYPE\\012\\012insert into sample_types\\012(id\\012,code\\012,description\\012,dbin_id)\\012values \\012(nextval('SAMPLE_TYPE_ID_SEQ')\\012,'WELL'\\012,'Plate Well'\\012,(select id from database_instances where is_original_source = true)\\012);\\012\\012\\012-- Transfer data from the SAMPLE_COMPONENTS table to the SAMPLES table\\012\\012INSERT INTO samples(\\012 id\\012 , code\\012 , samp_id_top\\012 , samp_id_generated_from\\012 , saty_id\\012 , pers_id_registerer\\012 , inva_id\\012 , samp_id_control_layout\\012 , dbin_id\\012 , grou_id\\012 , samp_id_part_of)\\012SELECT nextval('sample_id_seq')\\012 , saco.code\\012 , null\\012 , null\\012 , (select id from sample_types where code = 'WELL')\\012 , (select id from persons where user_id ='system')\\012 , samp.inva_id\\012 , null\\012 , samp.dbin_id\\012 , samp.grou_id\\012 , saco.samp_id\\012FROM samples samp INNER JOIN sample_components saco\\012 ON samp.id = saco.samp_id;\\012\\012\\012-- Fill the SAMPLE_MATERIAL_BATCHES table via SAMPLE_C0MPONENT_MATERIALS, SAMPLE_C0MPONENTS, SAMPLES and MATERIAL_BATCHES tables\\012\\012INSERT INTO sample_material_batches(\\012 id\\012 , samp_id\\012 , maba_id)\\012SELECT nextval('sample_material_batch_id_seq')\\012 , well.id\\012 , scma.maba_id\\012FROM sample_component_materials scma \\012 INNER JOIN material_batches maba\\012 ON scma.maba_id = maba.id\\012 INNER JOIN sample_components saco\\012 ON scma.saco_id = saco.id\\012 INNER JOIN samples well\\012 ON saco.code = well.code and saco.samp_id = well.samp_id_part_of\\012;\\012\\012\\012-- Drop the retired Database Objects\\012\\012DROP TABLE SAMPLE_COMPONENT_MATERIALS;\\012DROP TABLE SAMPLE_COMPONENTS;\\012\\012DROP SEQUENCE SCMA_ID_SEQ;\\012DROP SEQUENCE SAMPLE_COMPONENT_ID_SEQ;\\012\\012------------------------------------------------------------------------------------\\012-- Purpose: Create trigger SAMPLE_CODE_UNIQUENESS_CHECK \\012------------------------------------------------------------------------------------\\012\\012CREATE OR REPLACE FUNCTION SAMPLE_CODE_UNIQUENESS_CHECK() RETURNS trigger AS $$\\012DECLARE\\012 counter INTEGER;\\012BEGIN\\012\\011IF (NEW.samp_id_part_of is NULL) THEN\\012\\011\\011IF (NEW.dbin_id is not NULL) THEN\\012\\011\\011\\011SELECT count(*) into counter FROM samples \\012\\011\\011\\011\\011where id != NEW.id and code = NEW.code and dbin_id = NEW.dbin_id;\\012\\011\\011\\011IF (counter > 0) THEN\\012\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample with the same code already exists.', NEW.code;\\012\\011\\011\\011END IF;\\012\\011\\011ELSIF (NEW.grou_id is not NULL) THEN\\012\\011\\011\\011SELECT count(*) into counter FROM samples \\012\\011\\011\\011\\011where id != NEW.id and code = NEW.code and grou_id = NEW.grou_id;\\012\\011\\011\\011IF (counter > 0) THEN\\012\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because group sample with the same code already exists.', NEW.code;\\012\\011\\011\\011END IF;\\012\\011\\011END IF;\\012 ELSE\\012\\011\\011IF (NEW.dbin_id is not NULL) THEN\\012\\011\\011\\011SELECT count(*) into counter FROM samples \\012\\011\\011\\011\\011where id != NEW.id and code = NEW.code and samp_id_part_of = NEW.samp_id_part_of and dbin_id = NEW.dbin_id;\\012\\011\\011\\011IF (counter > 0) THEN\\012\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample with the same code and being the part of the same parent already exists.', NEW.code;\\012\\011\\011\\011END IF;\\012\\011\\011ELSIF (NEW.grou_id is not NULL) THEN\\012\\011\\011\\011SELECT count(*) into counter FROM samples \\012\\011\\011\\011\\011where id != NEW.id and code = NEW.code and samp_id_part_of = NEW.samp_id_part_of and grou_id = NEW.grou_id;\\012\\011\\011\\011IF (counter > 0) THEN\\012\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because group sample with the same code and being the part of the same parent already exists.', NEW.code;\\012\\011\\011\\011END IF;\\012\\011\\011END IF;\\012 END IF; \\012 RETURN NEW;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012CREATE TRIGGER SAMPLE_CODE_UNIQUENESS_CHECK BEFORE INSERT OR UPDATE ON SAMPLES\\012 FOR EACH ROW EXECUTE PROCEDURE SAMPLE_CODE_UNIQUENESS_CHECK();\\012 \N -024 ../openbis/source/sql/postgresql/migration/migration-023-024.sql SUCCESS 2008-09-26 15:35:36.895 -- JAVA ch.systemsx.cisd.openbis.generic.server.dataaccess.migration.MigrationStepFrom023To024\\012\\012-- Drop constraint DBIN_GLOBAL_CODE_UK of DATABASE_INSTANCES table\\012\\012ALTER TABLE DATABASE_INSTANCES DROP CONSTRAINT DBIN_GLOBAL_CODE_UK;\\012\\012-- Name changes\\012\\012ALTER TABLE DATABASE_INSTANCES RENAME COLUMN GLOBAL_CODE TO UUID;\\012\\012-- Add constraint DBIN_UUID_UK to the DATABASE_INSTANCES table\\012\\012ALTER TABLE DATABASE_INSTANCES ADD CONSTRAINT DBIN_UUID_UK UNIQUE(UUID);\\012\\012-- Drop column in EXPERIMENTS\\012\\012ALTER TABLE EXPERIMENTS DROP COLUMN DESCRIPTION;\\012\\012-- Add index to SAMPLES table\\012\\012CREATE INDEX SAMP_CODE_I ON SAMPLES (CODE);\\012\\012-- Bug fix in trigger function SAMPLE_CODE_UNIQUENESS_CHECK()\\012\\012CREATE OR REPLACE FUNCTION SAMPLE_CODE_UNIQUENESS_CHECK() RETURNS trigger AS $$\\012DECLARE\\012 counter INTEGER;\\012BEGIN\\012 IF (NEW.samp_id_part_of is NULL) THEN\\012 IF (NEW.dbin_id is not NULL) THEN\\012 SELECT count(*) into counter FROM samples \\012 where id != NEW.id and code = NEW.code and samp_id_part_of is NULL and dbin_id = NEW.dbin_id;\\012 IF (counter > 0) THEN\\012 RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample with the same code already exists.', NEW.code;\\012 END IF;\\012 ELSIF (NEW.grou_id is not NULL) THEN\\012 SELECT count(*) into counter FROM samples \\012 where id != NEW.id and code = NEW.code and samp_id_part_of is NULL and grou_id = NEW.grou_id;\\012 IF (counter > 0) THEN\\012 RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because group sample with the same code already exists.', NEW.code;\\012 END IF;\\012 END IF;\\012 ELSE\\012 IF (NEW.dbin_id is not NULL) THEN\\012 SELECT count(*) into counter FROM samples \\012 where id != NEW.id and code = NEW.code and samp_id_part_of = NEW.samp_id_part_of and dbin_id = NEW.dbin_id;\\012 IF (counter > 0) THEN\\012 RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample with the same code and being the part of the same parent already exists.', NEW.code;\\012 END IF;\\012 ELSIF (NEW.grou_id is not NULL) THEN\\012 SELECT count(*) into counter FROM samples \\012 where id != NEW.id and code = NEW.code and samp_id_part_of = NEW.samp_id_part_of and grou_id = NEW.grou_id;\\012 IF (counter > 0) THEN\\012 RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because group sample with the same code and being the part of the same parent already exists.', NEW.code;\\012 END IF;\\012 END IF;\\012 END IF; \\012 RETURN NEW;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012 \N -025 ../openbis/source/sql/postgresql/migration/migration-024-025.sql SUCCESS 2008-09-26 15:35:37.007 -- move screenable plates to a group, because it's no longer possible\\012-- to have such plates on the instance level\\012\\012CREATE OR REPLACE FUNCTION move_exp_samples_to_group() RETURNS integer AS $$\\012DECLARE\\012 sample RECORD;\\012 groupId Integer;\\012BEGIN\\012 FOR sample IN \\012 (SELECT * FROM samples s inner join sample_types t on s.saty_id = t.id \\012\\011where t.code in ('CELL_PLATE', 'REINFECT_PLATE'))\\012 LOOP\\012\\011if (sample.dbin_id is not NULL) THEN\\012\\011\\011select proj.grou_id into groupId from\\012\\011\\011\\011samples sa\\012\\011\\011\\011left outer join sample_inputs si on sa.id = si.samp_id \\012\\011\\011\\011left outer join procedures proc on proc.id = si.proc_id \\012\\011\\011\\011left outer join experiments ex on ex.id = proc.expe_id\\012\\011\\011\\011left outer join projects proj on proj.id = ex.proj_id\\012\\011\\011where sa.id = sample.id;\\012\\011\\011if (groupId is NULL) THEN\\012\\011\\011\\011select id into groupId from groups limit 1;\\012\\011\\011END IF;\\012\\011\\011if (groupId is NULL) THEN\\012\\011\\011\\011RAISE EXCEPTION 'There is no group in the database - internal error!';\\012\\011\\011END IF;\\012\\011\\011update samples set grou_id = groupId, dbin_id = NULL\\012\\011\\011 where id = sample.id;\\012\\011END IF;\\012 END LOOP;\\012 RETURN 1;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012select move_exp_samples_to_group();\\012\\012-- Create new table DATA_STORES.\\012\\012CREATE TABLE DATA_STORES (ID TECH_ID NOT NULL,DBIN_ID TECH_ID NOT NULL,CODE CODE NOT NULL,DOWNLOAD_URL VARCHAR(1024) NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP);\\012CREATE SEQUENCE DATA_STORE_ID_SEQ;\\012ALTER TABLE DATA_STORES ADD CONSTRAINT DAST_PK PRIMARY KEY(ID);\\012ALTER TABLE DATA_STORES ADD CONSTRAINT DAST_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE DATA_STORES ADD CONSTRAINT DAST_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012CREATE INDEX DAST_DBIN_FK_I ON DATA_STORES (DBIN_ID);\\012\\012-- Add new column DAST_ID (connection to DATA_STORES table) to tables DATABASE_INSTANCES, GROUPS, PROJECTS, EXPERIMENTS.\\012\\012ALTER TABLE DATABASE_INSTANCES ADD COLUMN DAST_ID TECH_ID;\\012ALTER TABLE GROUPS ADD COLUMN DAST_ID TECH_ID;\\012ALTER TABLE PROJECTS ADD COLUMN DAST_ID TECH_ID;\\012ALTER TABLE EXPERIMENTS ADD COLUMN DAST_ID TECH_ID;\\012\\012-- Create the STANDARD data store and assign it to the home database instance.\\012 \\012insert into data_stores\\012(id\\012,code\\012,download_url\\012,dbin_id)\\012values \\012(nextval('DATA_STORE_ID_SEQ')\\012,'STANDARD'\\012,''\\012,(select id from database_instances where is_original_source = true)\\012);\\012\\012update database_instances set dast_id = (select id from data_stores where code = 'STANDARD') where is_original_source = true;\\012\\012-- Add foreign key constratints.\\012\\012ALTER TABLE DATABASE_INSTANCES ADD CONSTRAINT DBIN_DAST_FK FOREIGN KEY (DAST_ID) REFERENCES DATA_STORES(ID);\\012ALTER TABLE GROUPS ADD CONSTRAINT GROU_DAST_FK FOREIGN KEY (DAST_ID) REFERENCES DATA_STORES(ID);\\012ALTER TABLE PROJECTS ADD CONSTRAINT PROJ_DAST_FK FOREIGN KEY (DAST_ID) REFERENCES DATA_STORES(ID);\\012ALTER TABLE EXPERIMENTS ADD CONSTRAINT EXPE_DAST_FK FOREIGN KEY (DAST_ID) REFERENCES DATA_STORES(ID);\\012 \N -026 ../openbis/source/sql/postgresql/migration/migration-025-026.sql SUCCESS 2008-09-26 15:35:37.176 -- JAVA ch.systemsx.cisd.openbis.generic.server.dataaccess.migration.MigrationStepFrom025To026\\012-- Remove ID column from SAMPLE_INPUTS table\\012DROP SEQUENCE SAMPLE_INPUT_ID_SEQ;\\012-- There was a bug in migration to db 23 - the constraint was not created. So we drop it only if it exists.\\012create function remove_sain_pk_constraint() returns void AS $$\\012begin\\012 perform *\\012 FROM information_schema.table_constraints WHERE constraint_name='sain_pk';\\012 if found\\012 then\\012\\011ALTER TABLE SAMPLE_INPUTS DROP CONSTRAINT SAIN_PK;\\012 end if;\\012end;\\012$$ language 'plpgsql';\\012select remove_sain_pk_constraint();\\012drop function remove_sain_pk_constraint();\\012ALTER TABLE SAMPLE_INPUTS DROP COLUMN ID;\\012ALTER TABLE SAMPLE_INPUTS ADD CONSTRAINT SAIN_PK PRIMARY KEY(SAMP_ID,PROC_ID);\\012\\012-- Remove ID column from SAMPLE_MATERIAL_BATCHES table\\012DROP SEQUENCE SAMPLE_MATERIAL_BATCH_ID_SEQ;\\012-- There was a bug in migration to db 23 - the constraint was not created. So we drop it only if it exists.\\012create function remove_samb_pk_constraint() returns void AS $$\\012begin\\012 perform *\\012 FROM information_schema.table_constraints WHERE constraint_name='SAMB_PK';\\012 if found\\012 then\\012\\012 end if;\\012end;\\012$$ language 'plpgsql';\\012select remove_samb_pk_constraint();\\012drop function remove_samb_pk_constraint();\\012ALTER TABLE SAMPLE_MATERIAL_BATCHES DROP COLUMN ID;\\012ALTER TABLE SAMPLE_MATERIAL_BATCHES ADD CONSTRAINT SAMB_PK PRIMARY KEY(SAMP_ID,MABA_ID);\\012\\012-- Remove ID and REGISTRATION_TIMESTAMP column from DATA_SET_RELATIONSHIPS table\\012DROP SEQUENCE DATA_SET_RELATIONSHIP_ID_SEQ;\\012ALTER TABLE DATA_SET_RELATIONSHIPS DROP CONSTRAINT DSRE_PK;\\012ALTER TABLE DATA_SET_RELATIONSHIPS DROP CONSTRAINT DSRE_BK_UK;\\012ALTER TABLE DATA_SET_RELATIONSHIPS DROP COLUMN ID;\\012ALTER TABLE DATA_SET_RELATIONSHIPS DROP COLUMN REGISTRATION_TIMESTAMP;\\012ALTER TABLE DATA_SET_RELATIONSHIPS ADD CONSTRAINT DSRE_PK PRIMARY KEY(DATA_ID_PARENT,DATA_ID_CHILD);\\012\\012-- Rename: \\012-- OBSERVABLE_TYPES -> DATA_SET_TYPES\\012-- OBSERVABLE_TYPE_ID_SEQ -> DATA_SET_TYPE_ID_SEQ\\012-- DATA.OBTY_ID -> DATA.DSTY_ID\\012ALTER TABLE OBSERVABLE_TYPES RENAME TO DATA_SET_TYPES;\\012ALTER TABLE OBSERVABLE_TYPE_ID_SEQ RENAME TO DATA_SET_TYPE_ID_SEQ;\\012ALTER TABLE DATA RENAME COLUMN OBTY_ID TO DSTY_ID;\\012 \N -027 ../openbis/source/sql/postgresql/migration/migration-026-027.sql SUCCESS 2008-09-26 15:35:37.256 -- remove the bug from previous db version\\012ALTER TABLE ROLE_ASSIGNMENTS DROP CONSTRAINT ROAS_BK_UK;\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_GROUP_BK_UK UNIQUE(PERS_ID_GRANTEE,ROLE_CODE,GROU_ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_INSTANCE_BK_UK UNIQUE(PERS_ID_GRANTEE,ROLE_CODE,DBIN_ID);\\012 \N +019 ../openbis/source/sql/postgresql/migration/migration-018-019.sql SUCCESS 2008-09-29 14:36:16.871 ----------------------------------------------------------------------------------------------\\012-- File: migration-018-019.sql\\012--\\012-- \\012-- This script enables the migration of the database schema from 018 to 019.\\012-- \\012----------------------------------------------------------------------------------------------\\012\\012\\012\\012--=================================\\012-- Create New Objects\\012--=================================\\012\\012-- Domains\\012\\012CREATE DOMAIN DESCRIPTION_1000 AS VARCHAR(1000);\\012CREATE DOMAIN AUTHORIZATION_ROLE as CODE CHECK (VALUE IN ('ADMIN', 'USER', 'OBSERVER', 'ETL_SERVER')) NOT NULL;\\012\\012\\012-- Tables\\012\\012CREATE TABLE DATABASE_INSTANCES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,IS_ORIGINAL_SOURCE BOOLEAN_CHAR NOT NULL DEFAULT 'F',REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP);\\012CREATE TABLE ROLE_ASSIGNMENTS (ID TECH_ID NOT NULL,ROLE_CODE AUTHORIZATION_ROLE,GROU_ID TECH_ID,DBIN_ID TECH_ID,PERS_ID_GRANTEE TECH_ID NOT NULL,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP);\\012\\012-- Columns \\012\\012-- Create the new DBIN_ID columns initially as NULLable!\\012\\012ALTER TABLE CONTROLLED_VOCABULARIES ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE EXPERIMENT_TYPES ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE EXPERIMENTS ADD COLUMN DESCRIPTION DESCRIPTION_250;\\012ALTER TABLE EXPERIMENTS ADD COLUMN IS_PUBLIC BOOLEAN_CHAR NOT NULL DEFAULT 'F';\\012ALTER TABLE FILE_FORMAT_TYPES ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE GROUPS ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE GROUPS ADD COLUMN GROU_ID_PARENT TECH_ID;\\012ALTER TABLE GROUPS ADD COLUMN PERS_ID_LEADER TECH_ID;\\012ALTER TABLE GROUPS ADD COLUMN DESCRIPTION DESCRIPTION_250;\\012ALTER TABLE GROUPS ADD COLUMN REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP;\\012ALTER TABLE GROUPS ADD COLUMN PERS_ID_REGISTERER TECH_ID;\\012ALTER TABLE MATERIALS ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE MATERIAL_TYPES ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE OBSERVABLE_TYPES ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE PERSONS ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE PERSONS ADD COLUMN PERS_ID_REGISTERER TECH_ID;\\012ALTER TABLE PERSONS ADD COLUMN REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP;\\012ALTER TABLE PROCEDURE_TYPES ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE PROJECTS ADD COLUMN PERS_ID_LEADER TECH_ID;\\012ALTER TABLE PROJECTS ADD COLUMN PERS_ID_REGISTERER TECH_ID;\\012ALTER TABLE PROJECTS ADD COLUMN REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP;\\012ALTER TABLE PROJECTS ADD COLUMN DESCRIPTION DESCRIPTION_1000;\\012ALTER TABLE PROPERTY_TYPES ADD COLUMN DBIN_ID TECH_ID;\\012ALTER TABLE SAMPLES ADD COLUMN DBIN_ID TECH_ID ;\\012ALTER TABLE SAMPLES ADD COLUMN GROU_ID TECH_ID ;\\012ALTER TABLE SAMPLE_TYPES ADD COLUMN DBIN_ID TECH_ID;\\012\\012\\012-- Primary Key Constraints\\012\\012ALTER TABLE DATABASE_INSTANCES ADD CONSTRAINT DBIN_PK PRIMARY KEY(ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_PK PRIMARY KEY(ID);\\012\\012-- Unique Key Constraints\\012\\012ALTER TABLE DATABASE_INSTANCES ADD CONSTRAINT DBIN_BK_UK UNIQUE(CODE);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_BK_UK UNIQUE(PERS_ID_GRANTEE,ROLE_CODE,GROU_ID,DBIN_ID);\\012\\012-- Foreign Key Constraints\\012\\012ALTER TABLE CONTROLLED_VOCABULARIES ADD CONSTRAINT COVO_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE EXPERIMENT_TYPES ADD CONSTRAINT EXTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE FILE_FORMAT_TYPES ADD CONSTRAINT FFTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE GROUPS ADD CONSTRAINT GROU_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE GROUPS ADD CONSTRAINT GROU_GROU_FK FOREIGN KEY (GROU_ID_PARENT) REFERENCES GROUPS(ID);\\012ALTER TABLE GROUPS ADD CONSTRAINT GROU_PERS_FK_LEADER FOREIGN KEY (PERS_ID_LEADER) REFERENCES PERSONS(ID);\\012ALTER TABLE GROUPS ADD CONSTRAINT GROU_PERS_FK_REGISTERER FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE MATERIALS ADD CONSTRAINT MATE_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE MATERIAL_TYPES ADD CONSTRAINT MATY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE OBSERVABLE_TYPES ADD CONSTRAINT OBTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE PERSONS ADD CONSTRAINT PERS_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE PROCEDURE_TYPES ADD CONSTRAINT PCTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE PROJECTS ADD CONSTRAINT PROJ_PERS_FK_LEADER FOREIGN KEY (PERS_ID_LEADER) REFERENCES PERSONS(ID);\\012ALTER TABLE PROJECTS ADD CONSTRAINT PROJ_PERS_FK_REGISTERER FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_GROU_FK FOREIGN KEY (GROU_ID) REFERENCES GROUPS(ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_PERS_FK_GRANTEE FOREIGN KEY (PERS_ID_GRANTEE) REFERENCES PERSONS(ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_PERS_FK_REGISTERER FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_GROU_FK FOREIGN KEY (GROU_ID) REFERENCES GROUPS(ID);\\012ALTER TABLE SAMPLE_TYPES ADD CONSTRAINT SATY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012\\012\\012-- Sequences\\012\\012CREATE SEQUENCE DATABASE_INSTANCE_ID_SEQ;\\012CREATE SEQUENCE ROLE_ASSIGNMENT_ID_SEQ;\\012\\012-- Indices\\012\\012CREATE INDEX EXDA_CVTE_FK_I ON EXTERNAL_DATA (CVTE_ID_STOR_FMT);\\012CREATE INDEX GROU_DBIN_FK_I ON GROUPS (DBIN_ID);\\012CREATE INDEX GROU_GROU_FK_I ON GROUPS (GROU_ID_PARENT);\\012CREATE INDEX GROU_PERS_FK_I ON GROUPS (PERS_ID_LEADER);\\012CREATE INDEX GROU_PERS_REGISTERED_BY_FK_I ON GROUPS (PERS_ID_REGISTERER);\\012CREATE INDEX PROJ_PERS_FK_I_LEADER ON PROJECTS (PERS_ID_LEADER);\\012CREATE INDEX PROJ_PERS_FK_I_REGISTERER ON PROJECTS (PERS_ID_REGISTERER);\\012CREATE INDEX ROAS_DBIN_FK_I ON ROLE_ASSIGNMENTS (DBIN_ID);\\012CREATE INDEX ROAS_GROU_FK_I ON ROLE_ASSIGNMENTS (GROU_ID);\\012CREATE INDEX ROAS_PERS_FK_I_GRANTEE ON ROLE_ASSIGNMENTS (PERS_ID_GRANTEE);\\012CREATE INDEX ROAS_PERS_FK_I_REGISTERER ON ROLE_ASSIGNMENTS (PERS_ID_REGISTERER);\\012\\012\\012--====================================\\012-- Alter Objects\\012--====================================\\012\\012-- Domains\\012\\012ALTER DOMAIN BOOLEAN_CHAR_OR_UNKNOWN SET DEFAULT 'U';\\012\\012-- Tables\\012\\012ALTER TABLE PERSONS ALTER COLUMN USER_ID SET NOT NULL;\\012\\012-- Primary Key Constraints\\012\\012\\012-- Unique Key Constraints\\012\\012 -- Drop the Unique Key Constraints\\012ALTER TABLE CONTROLLED_VOCABULARIES DROP CONSTRAINT COVO_BK_UK ;\\012ALTER TABLE EXPERIMENT_TYPES DROP CONSTRAINT EXTY_BK_UK ;\\012ALTER TABLE FILE_FORMAT_TYPES DROP CONSTRAINT FFTY_BK_UK ;\\012ALTER TABLE GROUPS DROP CONSTRAINT GROU_BK_UK ;\\012ALTER TABLE MATERIALS DROP CONSTRAINT MATE_BK_UK ;\\012ALTER TABLE MATERIAL_TYPES DROP CONSTRAINT MATY_BK_UK ;\\012ALTER TABLE OBSERVABLE_TYPES DROP CONSTRAINT OBTY_BK_UK ;\\012ALTER TABLE PERSONS DROP CONSTRAINT PERS_BK_UK ;\\012ALTER TABLE PROCEDURE_TYPES DROP CONSTRAINT PCTY_BK_UK ;\\012ALTER TABLE PROPERTY_TYPES DROP CONSTRAINT PRTY_BK_UK ;\\012ALTER TABLE ROLE_ASSIGNMENTS DROP CONSTRAINT ROAS_BK_UK ;\\012ALTER TABLE SAMPLES DROP CONSTRAINT SAMP_BK_UK ;\\012ALTER TABLE SAMPLE_TYPES DROP CONSTRAINT SATY_BK_UK ;\\012\\012-- There was a bug in migration - the constraint was not created. So we drop it only if it exists.\\012create function remove_maty_uk_constraint() returns void AS $$\\012begin\\012 perform *\\012 FROM information_schema.table_constraints WHERE constraint_name='MATY_UK';\\012 if found\\012 then\\012\\011ALTER TABLE MATERIAL_TYPES DROP CONSTRAINT MATY_UK ;\\012 end if;\\012end;\\012$$ language 'plpgsql';\\012select remove_maty_uk_constraint();\\012drop function remove_maty_uk_constraint();\\012\\012 -- ReCreate the Unique Key Constraints with the extended columns\\012ALTER TABLE CONTROLLED_VOCABULARIES ADD CONSTRAINT COVO_BK_UK UNIQUE(CODE,IS_INTERNAL_NAMESPACE,DBIN_ID);\\012ALTER TABLE EXPERIMENT_TYPES ADD CONSTRAINT EXTY_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE FILE_FORMAT_TYPES ADD CONSTRAINT FFTY_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE GROUPS ADD CONSTRAINT GROU_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE MATERIALS ADD CONSTRAINT MATE_BK_UK UNIQUE(CODE,MATY_ID,DBIN_ID);\\012ALTER TABLE MATERIAL_TYPES ADD CONSTRAINT MATY_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE OBSERVABLE_TYPES ADD CONSTRAINT OBTY_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE PERSONS ADD CONSTRAINT PERS_BK_UK UNIQUE(DBIN_ID,USER_ID);\\012ALTER TABLE PROCEDURE_TYPES ADD CONSTRAINT PCTY_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_BK_UK UNIQUE(CODE,IS_INTERNAL_NAMESPACE,DBIN_ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_BK_UK UNIQUE(PERS_ID_GRANTEE,ROLE_CODE,GROU_ID,DBIN_ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_BK_UK UNIQUE(CODE,DBIN_ID,GROU_ID);\\012ALTER TABLE SAMPLE_TYPES ADD CONSTRAINT SATY_BK_UK UNIQUE(CODE,DBIN_ID);\\012\\012\\012\\012-- Foreign Key Constraints\\012\\012 -- Rename according to the naming convention\\012ALTER TABLE EXTERNAL_DATA DROP CONSTRAINT EXDA_STOR_FMT_FK;\\012ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_CVTE_FK FOREIGN KEY (CVTE_ID_STOR_FMT) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID);\\012\\012\\012-- Check Constraints\\012\\012-- Indexes\\012\\012 -- Rename according to the naming convention\\012DROP INDEX DATA_SAMP_DERIVED_FROM_FK_I ;\\012DROP INDEX DATA_SAMP_FK_I ;\\012CREATE INDEX DATA_SAMP_FK_I_ACQUIRED_FROM ON DATA (SAMP_ID_ACQUIRED_FROM);\\012CREATE INDEX DATA_SAMP_FK_I_DERIVED_FROM ON DATA (SAMP_ID_DERIVED_FROM);\\012\\012\\012\\012\\012--====================================\\012-- Delete Objects\\012--====================================\\012\\012-- Domains\\012\\012DROP DOMAIN DOUBLE_PRECISION_VALUE;\\012\\012-- Tables\\012\\012-- Sequences\\012\\012-- Indices\\012\\012\\012--=================================\\012-- Data Migration\\012--=================================\\012\\012INSERT INTO database_instances(\\012 id\\012 , code\\012 , is_original_source)\\012 VALUES ( nextval('DATABASE_INSTANCE_ID_SEQ')\\012 , 'SYSTEM_DEFAULT'\\012 , 'T');\\012\\012\\012-----------------------------------------------------------------------------------\\012-- Fill the FK column in all tables that reference the DATABASE_INSTANCES table\\012-----------------------------------------------------------------------------------\\012\\012update CONTROLLED_VOCABULARIES \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update EXPERIMENT_TYPES \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update FILE_FORMAT_TYPES \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update GROUPS \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update MATERIALS \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update MATERIAL_TYPES \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update OBSERVABLE_TYPES \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update PERSONS \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update PROCEDURE_TYPES \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update PROPERTY_TYPES \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update SAMPLES \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012update SAMPLE_TYPES \\012set dbin_id = (select id from database_instances where code = 'SYSTEM_DEFAULT');\\012\\012\\012-----------------------------------------------------------------------------------\\012-- Fill the FK column in all tables that newly reference the PERSONS table\\012-----------------------------------------------------------------------------------\\012\\012update GROUPS \\012set PERS_ID_REGISTERER = (select id from persons where user_id = 'system');\\012\\012\\012\\012\\012-- Columns \\012\\012-- Change certain new columns to possess the NOT NULL constraint\\012\\012ALTER TABLE CONTROLLED_VOCABULARIES ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE EXPERIMENT_TYPES ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE FILE_FORMAT_TYPES ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE GROUPS ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE GROUPS ALTER COLUMN PERS_ID_REGISTERER SET NOT NULL;\\012ALTER TABLE MATERIALS ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE MATERIAL_TYPES ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE OBSERVABLE_TYPES ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE PERSONS ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE PROCEDURE_TYPES ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE PROPERTY_TYPES ALTER COLUMN DBIN_ID SET NOT NULL;\\012ALTER TABLE SAMPLE_TYPES ALTER COLUMN DBIN_ID SET NOT NULL;\\012\\012-- Check Constraints\\012\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_DBIN_GROU_ARC_CK CHECK ((DBIN_ID IS NOT NULL AND GROU_ID IS NULL) OR (DBIN_ID IS NULL AND GROU_ID IS NOT NULL));\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_DBIN_GROU_ARC_CK CHECK ((DBIN_ID IS NOT NULL AND GROU_ID IS NULL) OR (DBIN_ID IS NULL AND GROU_ID IS NOT NULL));\\012 \N +020 ../openbis/source/sql/postgresql/migration/migration-019-020.sql SUCCESS 2008-09-29 14:36:17.095 -- migration-019-020.sql\\012\\012\\012-- Creating domains\\012\\012--------\\012-- Added\\012--------\\012\\012CREATE DOMAIN EVENT_TYPE AS VARCHAR(40) CHECK (VALUE IN ('DELETION', 'INVALIDATION', 'MOVEMENT'));\\012\\012----------\\012-- Changed\\012----------\\012\\012-- Change the domain AUTHORIZATION_ROLE by changing its TYPE to VARCHAR(40) and dropping the NOT NULL constraint\\012\\012ALTER TABLE ROLE_ASSIGNMENTS ALTER COLUMN ROLE_CODE TYPE CODE;\\012DROP DOMAIN AUTHORIZATION_ROLE;\\012CREATE DOMAIN AUTHORIZATION_ROLE AS VARCHAR(40) CHECK (VALUE IN ('ADMIN', 'USER', 'OBSERVER', 'ETL_SERVER')) ;\\012ALTER TABLE ROLE_ASSIGNMENTS ALTER COLUMN ROLE_CODE TYPE AUTHORIZATION_ROLE;\\012\\012\\012-- Creating tables\\012\\012--------\\012-- Added\\012--------\\012\\012CREATE TABLE EVENTS (ID TECH_ID NOT NULL,EVENT_TYPE EVENT_TYPE NOT NULL,DATA_ID TECH_ID,DESCRIPTION DESCRIPTION_250,REASON DESCRIPTION_250,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP);\\012\\012----------\\012-- Changed\\012----------\\012\\012ALTER TABLE DATA ADD COLUMN IS_DELETED BOOLEAN_CHAR DEFAULT 'F';\\012ALTER TABLE DATA ADD COLUMN IS_VALID BOOLEAN_CHAR DEFAULT 'T';\\012\\012ALTER TABLE EXTERNAL_DATA ADD COLUMN CVTE_ID_STORE TECH_ID;\\012\\012ALTER TABLE PERSONS ADD COLUMN GROU_ID TECH_ID;\\012\\012ALTER TABLE ROLE_ASSIGNMENTS ALTER COLUMN ROLE_CODE SET NOT NULL;\\012\\012UPDATE EXPERIMENTS SET PERS_ID_REGISTERER = (SELECT ID FROM PERSONS WHERE USER_ID ='system') WHERE PERS_ID_REGISTERER IS NULL;\\012ALTER TABLE EXPERIMENTS ALTER COLUMN PERS_ID_REGISTERER SET NOT NULL;\\012\\012UPDATE PROJECTS SET PERS_ID_REGISTERER = (SELECT ID FROM PERSONS WHERE USER_ID ='system') WHERE PERS_ID_REGISTERER IS NULL;\\012ALTER TABLE PROJECTS ALTER COLUMN PERS_ID_REGISTERER SET NOT NULL;\\012\\012UPDATE PERSONS SET GROU_ID = (SELECT ID FROM GROUPS LIMIT 1);\\012\\012-- Creating sequences\\012\\012--------\\012-- Added\\012--------\\012\\012CREATE SEQUENCE EVENT_ID_SEQ;\\012\\012\\012-- Creating primary key constraints\\012\\012--------\\012-- Added\\012--------\\012\\012ALTER TABLE EVENTS ADD CONSTRAINT EVNT_PK PRIMARY KEY(ID);\\012\\012\\012-- Creating unique constraints\\012\\012ALTER TABLE EVENTS ADD CONSTRAINT EVNT_BK_UK UNIQUE(EVENT_TYPE,DATA_ID);\\012\\012----------\\012-- Changed\\012----------\\012\\012ALTER TABLE ROLE_ASSIGNMENTS DROP CONSTRAINT ROAS_BK_UK ;\\012\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_BK_UK UNIQUE(PERS_ID_GRANTEE,ROLE_CODE,GROU_ID,DBIN_ID);\\012\\012\\012-- Creating foreign key constraints\\012\\012--------\\012-- Added\\012--------\\012\\012ALTER TABLE EVENTS ADD CONSTRAINT EVNT_DATA_FK FOREIGN KEY (DATA_ID) REFERENCES DATA(ID);\\012ALTER TABLE EVENTS ADD CONSTRAINT EVNT_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_CVTE_STORED_ON_FK FOREIGN KEY (CVTE_ID_STORE) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID);\\012ALTER TABLE PERSONS ADD CONSTRAINT PERS_GROU_FK FOREIGN KEY (GROU_ID) REFERENCES GROUPS(ID);\\012\\012\\012\\012-- Creating check constraints\\012\\012\\012-- Creating indices\\012\\012--------\\012-- Added\\012--------\\012\\012CREATE INDEX EVNT_DATA_FK_I ON EVENTS (DATA_ID);\\012CREATE INDEX EVNT_PERS_FK_I ON EVENTS (PERS_ID_REGISTERER);\\012CREATE INDEX EXDA_CVTE_STORED_ON_FK_I ON EXTERNAL_DATA (CVTE_ID_STORE);\\012CREATE INDEX PERS_GROU_FK_I ON PERSONS (GROU_ID);\\012 \N +021 ../openbis/source/sql/postgresql/migration/migration-020-021.sql SUCCESS 2008-09-29 14:36:17.187 ------------------------\\012-- migration-020-021.sql\\012------------------------\\012\\012-- Translate the AUTHORIZATION_ROLE value ADMIN to 'INSTANCE_ADMIN' and 'GROUP_ADMIN' \\012\\012ALTER DOMAIN AUTHORIZATION_ROLE DROP CONSTRAINT AUTHORIZATION_ROLE_CHECK;\\012ALTER DOMAIN AUTHORIZATION_ROLE ADD CONSTRAINT AUTHORIZATION_ROLE_CHECK CHECK (VALUE IN ('ADMIN', 'USER', 'OBSERVER', 'ETL_SERVER'));\\012\\012-- Modify the UK of the SAMPLES table\\012\\012ALTER TABLE SAMPLES DROP CONSTRAINT SAMP_BK_UK;\\012\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_BK_DBIN_UK UNIQUE(SATY_ID,CODE,DBIN_ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_BK_GROU_UK UNIQUE(SATY_ID,CODE,GROU_ID);\\012\\012\\012 \N +022 ../openbis/source/sql/postgresql/migration/migration-021-022.sql SUCCESS 2008-09-29 14:36:17.265 -- Drop the UKs SAMP_BK_DBIN_UK and SAMP_BK_GROU_UK of the SAMPLES table\\012\\012ALTER TABLE SAMPLES DROP CONSTRAINT SAMP_BK_DBIN_UK;\\012ALTER TABLE SAMPLES DROP CONSTRAINT SAMP_BK_GROU_UK;\\012\\012-- Recreate the UKs SAMP_BK_DBIN_UK and SAMP_BK_GROU_UK of the SAMPLES table, but without the SATY_ID column.\\012\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_BK_DBIN_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_BK_GROU_UK UNIQUE(CODE,GROU_ID);\\012 \N +023 ../openbis/source/sql/postgresql/migration/migration-022-023.sql SUCCESS 2008-09-29 14:36:22.005 -- JAVA ch.systemsx.cisd.openbis.generic.server.dataaccess.migration.MigrationStepFrom022To023\\012\\012-- Add column GLOBAL_CODE to the DATABASE_INSTANCES table.\\012-- Set it's value from the code, it will be updated later from java.\\012\\012ALTER TABLE DATABASE_INSTANCES ADD COLUMN GLOBAL_CODE CODE;\\012update DATABASE_INSTANCES set GLOBAL_CODE = CODE;\\012ALTER TABLE DATABASE_INSTANCES ADD CONSTRAINT DBIN_GLOBAL_CODE_UK UNIQUE(GLOBAL_CODE);\\012ALTER TABLE DATABASE_INSTANCES alter column GLOBAL_CODE set NOT NULL;\\012\\012-- Add column the new FK column SAMP_ID_PART_OF of the SAMPLES table\\012\\012ALTER TABLE SAMPLES ADD COLUMN SAMP_ID_PART_OF TECH_ID;\\012\\012-- Drop constraint SAMP_BK_DBIN_UK of SAMPLES table\\012\\012ALTER TABLE SAMPLES DROP CONSTRAINT SAMP_BK_DBIN_UK;\\012\\012-- Drop constraint SAMP_BK_GROU_UK of SAMPLES table\\012\\012ALTER TABLE SAMPLES DROP CONSTRAINT SAMP_BK_GROU_UK;\\012\\012-- Add FK PART_OF to the SAMPLES table\\012\\012ALTER TABLE SAMPLES ADD CONSTRAINT SAMP_SAMP_FK_PART_OF FOREIGN KEY (SAMP_ID_PART_OF) REFERENCES SAMPLES(ID);\\012\\012-- Add Index for the FK Part Of of the SAMPLES table\\012CREATE INDEX SAMP_SAMP_FK_I_PART_OF ON SAMPLES (SAMP_ID_PART_OF);\\012\\012-- Create the SAMPLE_MATERIAL_BATCHES table\\012\\012CREATE TABLE SAMPLE_MATERIAL_BATCHES (ID TECH_ID NOT NULL,SAMP_ID TECH_ID NOT NULL,MABA_ID TECH_ID NOT NULL);\\012ALTER TABLE SAMPLE_MATERIAL_BATCHES ADD CONSTRAINT SAMB_PK PRIMARY KEY(ID);\\012\\012-- Create the sequence for the SAMPLE_MATERIAL_BATCHES table\\012\\012CREATE SEQUENCE SAMPLE_MATERIAL_BATCH_ID_SEQ;\\012\\012\\012-- Create WELL as a new SAMPLE_TYPE\\012\\012insert into sample_types\\012(id\\012,code\\012,description\\012,dbin_id)\\012values \\012(nextval('SAMPLE_TYPE_ID_SEQ')\\012,'WELL'\\012,'Plate Well'\\012,(select id from database_instances where is_original_source = true)\\012);\\012\\012\\012-- Transfer data from the SAMPLE_COMPONENTS table to the SAMPLES table\\012\\012INSERT INTO samples(\\012 id\\012 , code\\012 , samp_id_top\\012 , samp_id_generated_from\\012 , saty_id\\012 , pers_id_registerer\\012 , inva_id\\012 , samp_id_control_layout\\012 , dbin_id\\012 , grou_id\\012 , samp_id_part_of)\\012SELECT nextval('sample_id_seq')\\012 , saco.code\\012 , null\\012 , null\\012 , (select id from sample_types where code = 'WELL')\\012 , (select id from persons where user_id ='system')\\012 , samp.inva_id\\012 , null\\012 , samp.dbin_id\\012 , samp.grou_id\\012 , saco.samp_id\\012FROM samples samp INNER JOIN sample_components saco\\012 ON samp.id = saco.samp_id;\\012\\012\\012-- Fill the SAMPLE_MATERIAL_BATCHES table via SAMPLE_C0MPONENT_MATERIALS, SAMPLE_C0MPONENTS, SAMPLES and MATERIAL_BATCHES tables\\012\\012INSERT INTO sample_material_batches(\\012 id\\012 , samp_id\\012 , maba_id)\\012SELECT nextval('sample_material_batch_id_seq')\\012 , well.id\\012 , scma.maba_id\\012FROM sample_component_materials scma \\012 INNER JOIN material_batches maba\\012 ON scma.maba_id = maba.id\\012 INNER JOIN sample_components saco\\012 ON scma.saco_id = saco.id\\012 INNER JOIN samples well\\012 ON saco.code = well.code and saco.samp_id = well.samp_id_part_of\\012;\\012\\012\\012-- Drop the retired Database Objects\\012\\012DROP TABLE SAMPLE_COMPONENT_MATERIALS;\\012DROP TABLE SAMPLE_COMPONENTS;\\012\\012DROP SEQUENCE SCMA_ID_SEQ;\\012DROP SEQUENCE SAMPLE_COMPONENT_ID_SEQ;\\012\\012------------------------------------------------------------------------------------\\012-- Purpose: Create trigger SAMPLE_CODE_UNIQUENESS_CHECK \\012------------------------------------------------------------------------------------\\012\\012CREATE OR REPLACE FUNCTION SAMPLE_CODE_UNIQUENESS_CHECK() RETURNS trigger AS $$\\012DECLARE\\012 counter INTEGER;\\012BEGIN\\012\\011IF (NEW.samp_id_part_of is NULL) THEN\\012\\011\\011IF (NEW.dbin_id is not NULL) THEN\\012\\011\\011\\011SELECT count(*) into counter FROM samples \\012\\011\\011\\011\\011where id != NEW.id and code = NEW.code and dbin_id = NEW.dbin_id;\\012\\011\\011\\011IF (counter > 0) THEN\\012\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample with the same code already exists.', NEW.code;\\012\\011\\011\\011END IF;\\012\\011\\011ELSIF (NEW.grou_id is not NULL) THEN\\012\\011\\011\\011SELECT count(*) into counter FROM samples \\012\\011\\011\\011\\011where id != NEW.id and code = NEW.code and grou_id = NEW.grou_id;\\012\\011\\011\\011IF (counter > 0) THEN\\012\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because group sample with the same code already exists.', NEW.code;\\012\\011\\011\\011END IF;\\012\\011\\011END IF;\\012 ELSE\\012\\011\\011IF (NEW.dbin_id is not NULL) THEN\\012\\011\\011\\011SELECT count(*) into counter FROM samples \\012\\011\\011\\011\\011where id != NEW.id and code = NEW.code and samp_id_part_of = NEW.samp_id_part_of and dbin_id = NEW.dbin_id;\\012\\011\\011\\011IF (counter > 0) THEN\\012\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample with the same code and being the part of the same parent already exists.', NEW.code;\\012\\011\\011\\011END IF;\\012\\011\\011ELSIF (NEW.grou_id is not NULL) THEN\\012\\011\\011\\011SELECT count(*) into counter FROM samples \\012\\011\\011\\011\\011where id != NEW.id and code = NEW.code and samp_id_part_of = NEW.samp_id_part_of and grou_id = NEW.grou_id;\\012\\011\\011\\011IF (counter > 0) THEN\\012\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because group sample with the same code and being the part of the same parent already exists.', NEW.code;\\012\\011\\011\\011END IF;\\012\\011\\011END IF;\\012 END IF; \\012 RETURN NEW;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012CREATE TRIGGER SAMPLE_CODE_UNIQUENESS_CHECK BEFORE INSERT OR UPDATE ON SAMPLES\\012 FOR EACH ROW EXECUTE PROCEDURE SAMPLE_CODE_UNIQUENESS_CHECK();\\012 \N +024 ../openbis/source/sql/postgresql/migration/migration-023-024.sql SUCCESS 2008-09-29 14:36:22.273 -- JAVA ch.systemsx.cisd.openbis.generic.server.dataaccess.migration.MigrationStepFrom023To024\\012\\012-- Drop constraint DBIN_GLOBAL_CODE_UK of DATABASE_INSTANCES table\\012\\012ALTER TABLE DATABASE_INSTANCES DROP CONSTRAINT DBIN_GLOBAL_CODE_UK;\\012\\012-- Name changes\\012\\012ALTER TABLE DATABASE_INSTANCES RENAME COLUMN GLOBAL_CODE TO UUID;\\012\\012-- Add constraint DBIN_UUID_UK to the DATABASE_INSTANCES table\\012\\012ALTER TABLE DATABASE_INSTANCES ADD CONSTRAINT DBIN_UUID_UK UNIQUE(UUID);\\012\\012-- Drop column in EXPERIMENTS\\012\\012ALTER TABLE EXPERIMENTS DROP COLUMN DESCRIPTION;\\012\\012-- Add index to SAMPLES table\\012\\012CREATE INDEX SAMP_CODE_I ON SAMPLES (CODE);\\012\\012-- Bug fix in trigger function SAMPLE_CODE_UNIQUENESS_CHECK()\\012\\012CREATE OR REPLACE FUNCTION SAMPLE_CODE_UNIQUENESS_CHECK() RETURNS trigger AS $$\\012DECLARE\\012 counter INTEGER;\\012BEGIN\\012 IF (NEW.samp_id_part_of is NULL) THEN\\012 IF (NEW.dbin_id is not NULL) THEN\\012 SELECT count(*) into counter FROM samples \\012 where id != NEW.id and code = NEW.code and samp_id_part_of is NULL and dbin_id = NEW.dbin_id;\\012 IF (counter > 0) THEN\\012 RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample with the same code already exists.', NEW.code;\\012 END IF;\\012 ELSIF (NEW.grou_id is not NULL) THEN\\012 SELECT count(*) into counter FROM samples \\012 where id != NEW.id and code = NEW.code and samp_id_part_of is NULL and grou_id = NEW.grou_id;\\012 IF (counter > 0) THEN\\012 RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because group sample with the same code already exists.', NEW.code;\\012 END IF;\\012 END IF;\\012 ELSE\\012 IF (NEW.dbin_id is not NULL) THEN\\012 SELECT count(*) into counter FROM samples \\012 where id != NEW.id and code = NEW.code and samp_id_part_of = NEW.samp_id_part_of and dbin_id = NEW.dbin_id;\\012 IF (counter > 0) THEN\\012 RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample with the same code and being the part of the same parent already exists.', NEW.code;\\012 END IF;\\012 ELSIF (NEW.grou_id is not NULL) THEN\\012 SELECT count(*) into counter FROM samples \\012 where id != NEW.id and code = NEW.code and samp_id_part_of = NEW.samp_id_part_of and grou_id = NEW.grou_id;\\012 IF (counter > 0) THEN\\012 RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because group sample with the same code and being the part of the same parent already exists.', NEW.code;\\012 END IF;\\012 END IF;\\012 END IF; \\012 RETURN NEW;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012 \N +025 ../openbis/source/sql/postgresql/migration/migration-024-025.sql SUCCESS 2008-09-29 14:36:22.386 -- move screenable plates to a group, because it's no longer possible\\012-- to have such plates on the instance level\\012\\012CREATE OR REPLACE FUNCTION move_exp_samples_to_group() RETURNS integer AS $$\\012DECLARE\\012 sample RECORD;\\012 groupId Integer;\\012BEGIN\\012 FOR sample IN \\012 (SELECT * FROM samples s inner join sample_types t on s.saty_id = t.id \\012\\011where t.code in ('CELL_PLATE', 'REINFECT_PLATE'))\\012 LOOP\\012\\011if (sample.dbin_id is not NULL) THEN\\012\\011\\011select proj.grou_id into groupId from\\012\\011\\011\\011samples sa\\012\\011\\011\\011left outer join sample_inputs si on sa.id = si.samp_id \\012\\011\\011\\011left outer join procedures proc on proc.id = si.proc_id \\012\\011\\011\\011left outer join experiments ex on ex.id = proc.expe_id\\012\\011\\011\\011left outer join projects proj on proj.id = ex.proj_id\\012\\011\\011where sa.id = sample.id;\\012\\011\\011if (groupId is NULL) THEN\\012\\011\\011\\011select id into groupId from groups limit 1;\\012\\011\\011END IF;\\012\\011\\011if (groupId is NULL) THEN\\012\\011\\011\\011RAISE EXCEPTION 'There is no group in the database - internal error!';\\012\\011\\011END IF;\\012\\011\\011update samples set grou_id = groupId, dbin_id = NULL\\012\\011\\011 where id = sample.id;\\012\\011END IF;\\012 END LOOP;\\012 RETURN 1;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012select move_exp_samples_to_group();\\012\\012-- Create new table DATA_STORES.\\012\\012CREATE TABLE DATA_STORES (ID TECH_ID NOT NULL,DBIN_ID TECH_ID NOT NULL,CODE CODE NOT NULL,DOWNLOAD_URL VARCHAR(1024) NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP);\\012CREATE SEQUENCE DATA_STORE_ID_SEQ;\\012ALTER TABLE DATA_STORES ADD CONSTRAINT DAST_PK PRIMARY KEY(ID);\\012ALTER TABLE DATA_STORES ADD CONSTRAINT DAST_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE DATA_STORES ADD CONSTRAINT DAST_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012CREATE INDEX DAST_DBIN_FK_I ON DATA_STORES (DBIN_ID);\\012\\012-- Add new column DAST_ID (connection to DATA_STORES table) to tables DATABASE_INSTANCES, GROUPS, PROJECTS, EXPERIMENTS.\\012\\012ALTER TABLE DATABASE_INSTANCES ADD COLUMN DAST_ID TECH_ID;\\012ALTER TABLE GROUPS ADD COLUMN DAST_ID TECH_ID;\\012ALTER TABLE PROJECTS ADD COLUMN DAST_ID TECH_ID;\\012ALTER TABLE EXPERIMENTS ADD COLUMN DAST_ID TECH_ID;\\012\\012-- Create the STANDARD data store and assign it to the home database instance.\\012 \\012insert into data_stores\\012(id\\012,code\\012,download_url\\012,dbin_id)\\012values \\012(nextval('DATA_STORE_ID_SEQ')\\012,'STANDARD'\\012,''\\012,(select id from database_instances where is_original_source = true)\\012);\\012\\012update database_instances set dast_id = (select id from data_stores where code = 'STANDARD') where is_original_source = true;\\012\\012-- Add foreign key constratints.\\012\\012ALTER TABLE DATABASE_INSTANCES ADD CONSTRAINT DBIN_DAST_FK FOREIGN KEY (DAST_ID) REFERENCES DATA_STORES(ID);\\012ALTER TABLE GROUPS ADD CONSTRAINT GROU_DAST_FK FOREIGN KEY (DAST_ID) REFERENCES DATA_STORES(ID);\\012ALTER TABLE PROJECTS ADD CONSTRAINT PROJ_DAST_FK FOREIGN KEY (DAST_ID) REFERENCES DATA_STORES(ID);\\012ALTER TABLE EXPERIMENTS ADD CONSTRAINT EXPE_DAST_FK FOREIGN KEY (DAST_ID) REFERENCES DATA_STORES(ID);\\012 \N +026 ../openbis/source/sql/postgresql/migration/migration-025-026.sql SUCCESS 2008-09-29 14:36:22.561 -- JAVA ch.systemsx.cisd.openbis.generic.server.dataaccess.migration.MigrationStepFrom025To026\\012-- Remove ID column from SAMPLE_INPUTS table\\012DROP SEQUENCE SAMPLE_INPUT_ID_SEQ;\\012-- There was a bug in migration to db 23 - the constraint was not created. So we drop it only if it exists.\\012create function remove_sain_pk_constraint() returns void AS $$\\012begin\\012 perform *\\012 FROM information_schema.table_constraints WHERE constraint_name='sain_pk';\\012 if found\\012 then\\012\\011ALTER TABLE SAMPLE_INPUTS DROP CONSTRAINT SAIN_PK;\\012 end if;\\012end;\\012$$ language 'plpgsql';\\012select remove_sain_pk_constraint();\\012drop function remove_sain_pk_constraint();\\012ALTER TABLE SAMPLE_INPUTS DROP COLUMN ID;\\012ALTER TABLE SAMPLE_INPUTS ADD CONSTRAINT SAIN_PK PRIMARY KEY(SAMP_ID,PROC_ID);\\012\\012-- Remove ID column from SAMPLE_MATERIAL_BATCHES table\\012DROP SEQUENCE SAMPLE_MATERIAL_BATCH_ID_SEQ;\\012-- There was a bug in migration to db 23 - the constraint was not created. So we drop it only if it exists.\\012create function remove_samb_pk_constraint() returns void AS $$\\012begin\\012 perform *\\012 FROM information_schema.table_constraints WHERE constraint_name='SAMB_PK';\\012 if found\\012 then\\012\\012 end if;\\012end;\\012$$ language 'plpgsql';\\012select remove_samb_pk_constraint();\\012drop function remove_samb_pk_constraint();\\012ALTER TABLE SAMPLE_MATERIAL_BATCHES DROP COLUMN ID;\\012ALTER TABLE SAMPLE_MATERIAL_BATCHES ADD CONSTRAINT SAMB_PK PRIMARY KEY(SAMP_ID,MABA_ID);\\012\\012-- Remove ID and REGISTRATION_TIMESTAMP column from DATA_SET_RELATIONSHIPS table\\012DROP SEQUENCE DATA_SET_RELATIONSHIP_ID_SEQ;\\012ALTER TABLE DATA_SET_RELATIONSHIPS DROP CONSTRAINT DSRE_PK;\\012ALTER TABLE DATA_SET_RELATIONSHIPS DROP CONSTRAINT DSRE_BK_UK;\\012ALTER TABLE DATA_SET_RELATIONSHIPS DROP COLUMN ID;\\012ALTER TABLE DATA_SET_RELATIONSHIPS DROP COLUMN REGISTRATION_TIMESTAMP;\\012ALTER TABLE DATA_SET_RELATIONSHIPS ADD CONSTRAINT DSRE_PK PRIMARY KEY(DATA_ID_PARENT,DATA_ID_CHILD);\\012\\012-- Rename: \\012-- OBSERVABLE_TYPES -> DATA_SET_TYPES\\012-- OBSERVABLE_TYPE_ID_SEQ -> DATA_SET_TYPE_ID_SEQ\\012-- DATA.OBTY_ID -> DATA.DSTY_ID\\012ALTER TABLE OBSERVABLE_TYPES RENAME TO DATA_SET_TYPES;\\012ALTER TABLE OBSERVABLE_TYPE_ID_SEQ RENAME TO DATA_SET_TYPE_ID_SEQ;\\012ALTER TABLE DATA RENAME COLUMN OBTY_ID TO DSTY_ID;\\012 \N +027 ../openbis/source/sql/postgresql/migration/migration-026-027.sql SUCCESS 2008-09-29 14:36:22.706 -- remove the bug from previous db version\\012ALTER TABLE ROLE_ASSIGNMENTS DROP CONSTRAINT ROAS_BK_UK;\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_GROUP_BK_UK UNIQUE(PERS_ID_GRANTEE,ROLE_CODE,GROU_ID);\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_INSTANCE_BK_UK UNIQUE(PERS_ID_GRANTEE,ROLE_CODE,DBIN_ID);\\012\\012-- add display properties to sample type\\012\\012ALTER TABLE SAMPLE_TYPES ADD COLUMN IS_LISTABLE BOOLEAN_CHAR NOT NULL DEFAULT 'T';\\012ALTER TABLE SAMPLE_TYPES ADD COLUMN GENERATED_FROM_DEPTH INTEGER NOT NULL DEFAULT 0;\\012ALTER TABLE SAMPLE_TYPES ADD COLUMN PART_OF_DEPTH INTEGER NOT NULL DEFAULT 0;\\012ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ADD COLUMN IS_DISPLAYED BOOLEAN_CHAR NOT NULL DEFAULT 'T';\\012\\012update sample_types\\012set generated_from_depth = 1\\012where code = 'DILUTION_PLATE';\\012\\012update sample_types\\012set generated_from_depth = 2\\012where code = 'CELL_PLATE';\\012\\012update sample_types\\012set generated_from_depth = 3\\012where code = 'REINFECT_PLATE';\\012\\012update sample_types\\012set is_listable = 'F', generated_from_depth = 0, part_of_depth = 1\\012where code = 'WELL';\\012 \N diff --git a/openbis/sourceTest/sql/postgresql/027/035=sample_type_property_types.tsv b/openbis/sourceTest/sql/postgresql/027/035=sample_type_property_types.tsv index 245d882fcddb34e6ecb65e3ee06fbe5b4f9e46fc..85013d33137a9e4e23c9bff8c024cf97f23ea0af 100644 --- a/openbis/sourceTest/sql/postgresql/027/035=sample_type_property_types.tsv +++ b/openbis/sourceTest/sql/postgresql/027/035=sample_type_property_types.tsv @@ -1,2 +1,2 @@ -1 1 6 t t 1 2008-05-09 10:11:22.561014+02 -2 5 6 t t 1 2008-05-09 10:11:22.561014+02 +1 1 6 t t 1 2008-05-09 10:11:22.561014+02 t +2 5 6 t t 1 2008-05-09 10:11:22.561014+02 t diff --git a/openbis/sourceTest/sql/postgresql/027/036=sample_types.tsv b/openbis/sourceTest/sql/postgresql/027/036=sample_types.tsv index c58bb8cf154dfbedb84e8e562b5cbfb2784c3a75..8c7782af2471cb302b9651b3a51cec59119faf41 100644 --- a/openbis/sourceTest/sql/postgresql/027/036=sample_types.tsv +++ b/openbis/sourceTest/sql/postgresql/027/036=sample_types.tsv @@ -1,6 +1,6 @@ -1 MASTER_PLATE Master Plate 1 -2 DILUTION_PLATE Dilution Plate 1 -3 CELL_PLATE Cell Plate 1 -4 REINFECT_PLATE Re-infection Plate 1 -5 CONTROL_LAYOUT Control layout 1 -6 WELL Plate Well 1 +1 MASTER_PLATE Master Plate 1 t 0 0 +5 CONTROL_LAYOUT Control layout 1 t 0 0 +2 DILUTION_PLATE Dilution Plate 1 t 1 0 +3 CELL_PLATE Cell Plate 1 t 2 0 +4 REINFECT_PLATE Re-infection Plate 1 t 3 0 +6 WELL Plate Well 1 f 0 1 diff --git a/openbis/sourceTest/sql/postgresql/027/schema-027.sql b/openbis/sourceTest/sql/postgresql/027/schema-027.sql index f327262195b98e120e50ad316ee0319484255994..ecd2a4983f22b926c2f861f36459064b4573f930 100644 --- a/openbis/sourceTest/sql/postgresql/027/schema-027.sql +++ b/openbis/sourceTest/sql/postgresql/027/schema-027.sql @@ -624,13 +624,17 @@ CREATE TABLE sample_type_property_types ( is_mandatory boolean_char DEFAULT false NOT NULL, is_managed_internally boolean_char DEFAULT false NOT NULL, pers_id_registerer tech_id NOT NULL, - registration_timestamp time_stamp_dfl + registration_timestamp time_stamp_dfl, + is_displayed boolean_char DEFAULT true NOT NULL ); CREATE TABLE sample_types ( id tech_id NOT NULL, code code NOT NULL, description description_80, - dbin_id tech_id NOT NULL + dbin_id tech_id NOT NULL, + is_listable boolean_char DEFAULT true NOT NULL, + generated_from_depth integer DEFAULT 0 NOT NULL, + part_of_depth integer DEFAULT 0 NOT NULL ); CREATE TABLE samples ( id tech_id NOT NULL,