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,