From 6ced9eb7439af4124a1310265e26c0b1f1093cc7 Mon Sep 17 00:00:00 2001
From: tpylak <tpylak>
Date: Fri, 3 Apr 2009 14:00:48 +0000
Subject: [PATCH] LMS-826 add to db schema the modification timestamp to the
 project table

SVN: 10558
---
 openbis/source/sql/generic/031/schema-031.sql             | 2 +-
 .../source/sql/postgresql/migration/migration-030-031.sql | 7 +++++++
 .../sql/postgresql/031/013=database_version_logs.tsv      | 2 +-
 openbis/sourceTest/sql/postgresql/031/032=projects.tsv    | 8 ++++----
 openbis/sourceTest/sql/postgresql/031/schema-031.sql      | 3 ++-
 5 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/openbis/source/sql/generic/031/schema-031.sql b/openbis/source/sql/generic/031/schema-031.sql
index 1aa4b86b8ed..54bea84ffdf 100644
--- a/openbis/source/sql/generic/031/schema-031.sql
+++ b/openbis/source/sql/generic/031/schema-031.sql
@@ -83,7 +83,7 @@ CREATE TABLE DATA_SET_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION
 CREATE TABLE PERSONS (ID TECH_ID NOT NULL,FIRST_NAME VARCHAR(30),LAST_NAME VARCHAR(30),USER_ID USER_ID NOT NULL,EMAIL OBJECT_NAME,DBIN_ID TECH_ID NOT NULL,GROU_ID TECH_ID,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID);
 CREATE TABLE PROCEDURES (ID TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,EXPE_ID TECH_ID NOT NULL,PCTY_ID TECH_ID NOT NULL);
 CREATE TABLE PROCEDURE_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_80 NOT NULL,IS_DATA_ACQUISITION BOOLEAN_CHAR NOT NULL DEFAULT 'F',DBIN_ID TECH_ID NOT NULL);
-CREATE TABLE PROJECTS (ID TECH_ID NOT NULL,CODE CODE NOT NULL,GROU_ID TECH_ID NOT NULL,PERS_ID_LEADER TECH_ID,DESCRIPTION DESCRIPTION_1000,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,DAST_ID TECH_ID);
+CREATE TABLE PROJECTS (ID TECH_ID NOT NULL,CODE CODE NOT NULL,GROU_ID TECH_ID NOT NULL,PERS_ID_LEADER TECH_ID,DESCRIPTION DESCRIPTION_1000,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP,DAST_ID TECH_ID);
 CREATE TABLE PROPERTY_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_80 NOT NULL,LABEL COLUMN_LABEL NOT NULL,DATY_ID TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL,COVO_ID TECH_ID,IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F',IS_INTERNAL_NAMESPACE BOOLEAN_CHAR NOT NULL DEFAULT 'F',DBIN_ID TECH_ID NOT NULL, MATY_PROP_ID TECH_ID);
 CREATE TABLE ROLE_ASSIGNMENTS (ID TECH_ID NOT NULL,ROLE_CODE AUTHORIZATION_ROLE NOT NULL,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);
 CREATE TABLE SAMPLES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,SAMP_ID_TOP TECH_ID,SAMP_ID_GENERATED_FROM TECH_ID,SATY_ID TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL,INVA_ID TECH_ID,SAMP_ID_CONTROL_LAYOUT TECH_ID,DBIN_ID TECH_ID,GROU_ID TECH_ID,SAMP_ID_PART_OF TECH_ID);
diff --git a/openbis/source/sql/postgresql/migration/migration-030-031.sql b/openbis/source/sql/postgresql/migration/migration-030-031.sql
index 950ebdb1a55..ae2b8984769 100644
--- a/openbis/source/sql/postgresql/migration/migration-030-031.sql
+++ b/openbis/source/sql/postgresql/migration/migration-030-031.sql
@@ -68,6 +68,13 @@ ALTER TABLE attachments
 CREATE INDEX ATTA_SAMP_FK_I ON ATTACHMENTS (SAMP_ID);
 CREATE INDEX ATTA_PROJ_FK_I ON ATTACHMENTS (PROJ_ID);
 
+-- -------
+-- Add modification timestamp to project table to allow edition
+-- -------
+
+ALTER TABLE projects
+	ADD COLUMN modification_timestamp TIME_STAMP DEFAULT CURRENT_TIMESTAMP;
+	
 -- -------
 -- Add new datatypes
 -- -------
diff --git a/openbis/sourceTest/sql/postgresql/031/013=database_version_logs.tsv b/openbis/sourceTest/sql/postgresql/031/013=database_version_logs.tsv
index 3dd9b959813..236bc8a1c85 100644
--- a/openbis/sourceTest/sql/postgresql/031/013=database_version_logs.tsv
+++ b/openbis/sourceTest/sql/postgresql/031/013=database_version_logs.tsv
@@ -4,4 +4,4 @@
 028	source/sql/postgresql/migration/migration-027-028.sql	SUCCESS	2008-11-18 13:24:17.508	-- Create EXPERIMENT_ATTACHMENT_CONTENTS.\\012CREATE TABLE EXPERIMENT_ATTACHMENT_CONTENTS (ID TECH_ID NOT NULL,VALUE FILE NOT NULL);\\012CREATE SEQUENCE EXPERIMENT_ATTACHMENT_CONTENT_ID_SEQ;\\012ALTER TABLE EXPERIMENT_ATTACHMENT_CONTENTS ADD CONSTRAINT EXAC_PK PRIMARY KEY(ID);\\012\\012-- Alter EXPERIMENT_ATTACHMENTS by adding the new column which has a NULL constraint.\\012-- The NOT NULL constraint is added later on.\\012ALTER TABLE EXPERIMENT_ATTACHMENTS ADD COLUMN EXAC_ID TECH_ID;\\012\\012-- Does the VALUE migration between EXPERIMENT_ATTACHMENTS to EXPERIMENT_ATTACHMENT_CONTENTS.\\012CREATE OR REPLACE FUNCTION move_exp_att_content() RETURNS integer AS $$\\012DECLARE\\012    rec RECORD;\\012    seq BIGINT;\\012BEGIN\\012  FOR rec IN SELECT id, value FROM EXPERIMENT_ATTACHMENTS LOOP\\012  \\011seq := nextval('EXPERIMENT_ATTACHMENT_CONTENT_ID_SEQ');\\012    INSERT INTO EXPERIMENT_ATTACHMENT_CONTENTS (id, value) VALUES (seq, rec.value);\\012    UPDATE EXPERIMENT_ATTACHMENTS SET exac_id = seq WHERE id = rec.id;\\012  END LOOP;\\012  RETURN 1;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012-- Call the function.\\012SELECT move_exp_att_content();\\012DROP FUNCTION move_exp_att_content();\\012\\012\\012-- Finish EXPERIMENT_ATTACHMENTS changes.\\012ALTER TABLE EXPERIMENT_ATTACHMENTS ADD CONSTRAINT EXAT_CONT_FK FOREIGN KEY (EXAC_ID) REFERENCES EXPERIMENT_ATTACHMENT_CONTENTS(ID);\\012ALTER TABLE EXPERIMENT_ATTACHMENTS DROP COLUMN VALUE;\\012ALTER TABLE EXPERIMENT_ATTACHMENTS ALTER COLUMN EXAC_ID SET NOT NULL;\\012	\N
 029	source/sql/postgresql/migration/migration-028-029.sql	SUCCESS	2009-03-18 10:50:20.105	-- -------\\012-- add modification_timestamp field to allow edition with Hibernate\\012-- -------\\012\\012ALTER TABLE samples\\012\\011ADD COLUMN modification_timestamp TIME_STAMP DEFAULT CURRENT_TIMESTAMP;\\012\\012ALTER TABLE experiments\\012\\011ADD COLUMN modification_timestamp TIME_STAMP DEFAULT CURRENT_TIMESTAMP;\\012\\012ALTER TABLE materials\\012\\011ADD COLUMN modification_timestamp TIME_STAMP DEFAULT CURRENT_TIMESTAMP;\\012\\012ALTER TABLE experiment_properties\\012\\011ADD COLUMN modification_timestamp TIME_STAMP DEFAULT CURRENT_TIMESTAMP;\\012\\012ALTER TABLE material_properties\\012\\011ADD COLUMN modification_timestamp TIME_STAMP DEFAULT CURRENT_TIMESTAMP;\\012\\012ALTER TABLE sample_properties\\012\\011ADD COLUMN modification_timestamp TIME_STAMP DEFAULT CURRENT_TIMESTAMP;\\012\\012-- -------\\012-- add property data type which references materials\\012-- -------\\012\\012ALTER TABLE property_types\\012\\011ADD COLUMN maty_prop_id tech_id;\\012\\012ALTER TABLE property_types\\012\\011ADD CONSTRAINT prty_maty_fk FOREIGN KEY (maty_prop_id) REFERENCES material_types(id);\\012\\012ALTER TABLE experiment_properties\\012\\011ADD COLUMN mate_prop_id tech_id;\\012\\012ALTER TABLE material_properties\\012\\011ADD COLUMN mate_prop_id tech_id;\\012\\012ALTER TABLE sample_properties\\012\\011ADD COLUMN mate_prop_id tech_id;\\012\\012ALTER TABLE experiment_properties\\012\\011ADD CONSTRAINT expr_mapr_fk FOREIGN KEY (mate_prop_id) REFERENCES materials(id);\\012\\012ALTER TABLE material_properties\\012\\011ADD CONSTRAINT mapr_mapr_fk FOREIGN KEY (mate_prop_id) REFERENCES materials(id);\\012\\012ALTER TABLE sample_properties\\012\\011ADD CONSTRAINT sapr_mapr_fk FOREIGN KEY (mate_prop_id) REFERENCES materials(id);\\012\\012insert into data_types\\012(id\\012 ,code\\012 ,description)\\012 values \\012 (nextval('DATA_TYPE_ID_SEQ')\\012 ,'MATERIAL'\\012 ,'Reference to a material'\\012);\\012\\012ALTER TABLE MATERIAL_PROPERTIES DROP CONSTRAINT MAPR_CK;\\012ALTER TABLE MATERIAL_PROPERTIES ADD CONSTRAINT MAPR_CK CHECK \\012\\011((VALUE IS NOT NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NULL) OR \\012\\011 (VALUE IS NULL AND CVTE_ID IS NOT NULL AND MATE_PROP_ID IS NULL) OR\\012\\011 (VALUE IS NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NOT NULL)\\012\\011);\\012\\012ALTER TABLE EXPERIMENT_PROPERTIES DROP CONSTRAINT EXPR_CK;\\012ALTER TABLE EXPERIMENT_PROPERTIES ADD CONSTRAINT EXPR_CK CHECK \\012\\011((VALUE IS NOT NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NULL) OR \\012\\011 (VALUE IS NULL AND CVTE_ID IS NOT NULL AND MATE_PROP_ID IS NULL) OR\\012\\011 (VALUE IS NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NOT NULL)\\012\\011);\\012\\012ALTER TABLE SAMPLE_PROPERTIES DROP CONSTRAINT SAPR_CK;\\012ALTER TABLE SAMPLE_PROPERTIES ADD CONSTRAINT SAPR_CK CHECK \\012\\011((VALUE IS NOT NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NULL) OR \\012\\011 (VALUE IS NULL AND CVTE_ID IS NOT NULL AND MATE_PROP_ID IS NULL) OR\\012\\011 (VALUE IS NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NOT NULL)\\012\\011);\\012\\012------------------------------------------------------------------------------------\\012--  Purpose:  Create trigger MATERIAL/SAMPLE/EXPERIMENT _PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK\\012--            It checks that if material property value is assigned to the entity,\\012--\\011\\011\\011\\011\\011\\011then the material type is equal to the one described by property type.\\012------------------------------------------------------------------------------------\\012\\012CREATE OR REPLACE FUNCTION MATERIAL_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK() RETURNS trigger AS $$\\012DECLARE\\012   v_type_id  CODE;\\012   v_type_id_prop  CODE;\\012BEGIN\\012   if NEW.mate_prop_id IS NOT NULL then\\012\\011\\011\\011-- find material type id of the property type \\012\\011\\011\\011select pt.maty_prop_id into v_type_id_prop \\012\\011\\011\\011  from material_type_property_types etpt, property_types pt \\012\\011\\011\\011 where NEW.mtpt_id = etpt.id AND etpt.prty_id = pt.id;\\012\\011\\011\\012\\011\\011\\011if v_type_id_prop IS NOT NULL then\\012\\011\\011\\011\\011-- find material type id of the material which consists the entity's property value\\012\\011\\011\\011\\011select entity.maty_id into v_type_id \\012\\011\\011\\011\\011  from materials entity\\012\\011\\011\\011\\011 where NEW.mate_prop_id = entity.id;\\012\\011\\011\\011\\011if v_type_id != v_type_id_prop then\\012\\011\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', \\012\\011\\011\\011\\011\\011\\011\\011 NEW.mate_prop_id, v_type_id, v_type_id_prop;\\012\\011\\011\\011\\011end if;\\012\\011\\011\\011end if;\\012   end if;\\012   RETURN NEW;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012CREATE TRIGGER MATERIAL_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK BEFORE INSERT OR UPDATE ON material_properties\\012    FOR EACH ROW EXECUTE PROCEDURE MATERIAL_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK();\\012    \\012CREATE OR REPLACE FUNCTION SAMPLE_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK() RETURNS trigger AS $$\\012DECLARE\\012   v_type_id  CODE;\\012   v_type_id_prop  CODE;\\012BEGIN\\012   if NEW.mate_prop_id IS NOT NULL then\\012\\011\\011\\011-- find material type id of the property type \\012\\011\\011\\011select pt.maty_prop_id into v_type_id_prop \\012\\011\\011\\011  from sample_type_property_types etpt, property_types pt \\012\\011\\011\\011 where NEW.stpt_id = etpt.id AND etpt.prty_id = pt.id;\\012\\011\\011\\012\\011\\011\\011if v_type_id_prop IS NOT NULL then\\012\\011\\011\\011\\011-- find material type id of the material which consists the entity's property value\\012\\011\\011\\011\\011select entity.maty_id into v_type_id \\012\\011\\011\\011\\011  from materials entity\\012\\011\\011\\011\\011 where NEW.mate_prop_id = entity.id;\\012\\011\\011\\011\\011if v_type_id != v_type_id_prop then\\012\\011\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', \\012\\011\\011\\011\\011\\011\\011\\011\\011\\011\\011\\011\\011 NEW.mate_prop_id, v_type_id, v_type_id_prop;\\012\\011\\011\\011\\011end if;\\012\\011\\011\\011end if;\\012   end if;\\012   RETURN NEW;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012CREATE TRIGGER SAMPLE_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK BEFORE INSERT OR UPDATE ON sample_properties\\012    FOR EACH ROW EXECUTE PROCEDURE SAMPLE_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK();\\012    \\012CREATE OR REPLACE FUNCTION EXPERIMENT_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK() RETURNS trigger AS $$\\012DECLARE\\012   v_type_id  CODE;\\012   v_type_id_prop  CODE;\\012BEGIN\\012   if NEW.mate_prop_id IS NOT NULL then\\012\\011\\011\\011-- find material type id of the property type \\012\\011\\011\\011select pt.maty_prop_id into v_type_id_prop \\012\\011\\011\\011  from experiment_type_property_types etpt, property_types pt \\012\\011\\011\\011 where NEW.etpt_id = etpt.id AND etpt.prty_id = pt.id;\\012\\011\\011\\012\\011\\011\\011if v_type_id_prop IS NOT NULL then\\012\\011\\011\\011\\011-- find material type id of the material which consists the entity's property value\\012\\011\\011\\011\\011select entity.maty_id into v_type_id \\012\\011\\011\\011\\011  from materials entity\\012\\011\\011\\011\\011 where NEW.mate_prop_id = entity.id;\\012\\011\\011\\011\\011if v_type_id != v_type_id_prop then\\012\\011\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', \\012\\011\\011\\011\\011\\011\\011\\011\\011\\011\\011\\011\\011 NEW.mate_prop_id, v_type_id, v_type_id_prop;\\012\\011\\011\\011\\011end if;\\012\\011\\011\\011end if;\\012   end if;\\012   RETURN NEW;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012CREATE TRIGGER EXPERIMENT_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK BEFORE INSERT OR UPDATE ON experiment_properties\\012    FOR EACH ROW EXECUTE PROCEDURE EXPERIMENT_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK();\\012       \\012-- -------\\012-- remove the reminescents of the OBSERVABLE_TYPE\\012-- -------\\012\\012ALTER TABLE data\\012\\011DROP CONSTRAINT data_obty_fk;\\012\\012ALTER TABLE data_set_types\\012\\011DROP CONSTRAINT obty_pk;\\012\\012ALTER TABLE data_set_types\\012\\011ADD CONSTRAINT dsty_pk PRIMARY KEY (id);\\012\\012ALTER TABLE data\\012\\011ADD CONSTRAINT data_dsty_fk FOREIGN KEY (dsty_id) REFERENCES data_set_types(id);\\012\\012ALTER TABLE data_set_types\\012\\011DROP CONSTRAINT obty_bk_uk;\\012\\012ALTER TABLE data_set_types\\012\\011DROP CONSTRAINT obty_dbin_fk;\\012\\012ALTER TABLE data_set_types\\012\\011ADD CONSTRAINT dsty_bk_uk UNIQUE (code, dbin_id);\\012\\012ALTER TABLE data_set_types\\012\\011ADD CONSTRAINT dsty_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id);\\012\\012DROP INDEX data_obty_fk_i;\\012\\012CREATE INDEX data_dsty_fk_i ON data(dsty_id);\\012	\N
 030	source/sql/postgresql/migration/migration-029-030.sql	SUCCESS	2009-03-23 15:34:44.72	-- -------\\012-- add modification_timestamp field to allow edition with Hibernate\\012-- -------\\012ALTER TABLE data\\012\\011ADD COLUMN modification_timestamp TIME_STAMP DEFAULT CURRENT_TIMESTAMP;\\012ALTER TABLE experiment_types\\012\\011ADD COLUMN modification_timestamp TIME_STAMP DEFAULT CURRENT_TIMESTAMP;\\012ALTER TABLE sample_types\\012\\011ADD COLUMN modification_timestamp TIME_STAMP DEFAULT CURRENT_TIMESTAMP;\\012ALTER TABLE material_types\\012\\011ADD COLUMN modification_timestamp TIME_STAMP DEFAULT CURRENT_TIMESTAMP;\\012ALTER TABLE data_set_types\\012\\011ADD COLUMN modification_timestamp TIME_STAMP DEFAULT CURRENT_TIMESTAMP;\\012ALTER TABLE controlled_vocabularies\\012\\011ADD COLUMN modification_timestamp TIME_STAMP DEFAULT CURRENT_TIMESTAMP;\\012-- -------\\012-- add properties to data sets\\012-- -------\\012CREATE TABLE DATA_SET_PROPERTIES (ID TECH_ID NOT NULL,DS_ID TECH_ID NOT NULL,DSTPT_ID TECH_ID NOT NULL,VALUE GENERIC_VALUE,CVTE_ID TECH_ID, MATE_PROP_ID TECH_ID, PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP);\\012CREATE TABLE DATA_SET_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,DSTY_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);\\012\\012CREATE SEQUENCE DATA_SET_PROPERTY_ID_SEQ;\\012CREATE SEQUENCE DSTPT_ID_SEQ;\\012\\012ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT DSTPT_PK PRIMARY KEY(ID);\\012ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_PK PRIMARY KEY(ID);\\012\\012ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT DSTPT_BK_UK UNIQUE(DSTY_ID,PRTY_ID);\\012ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_BK_UK UNIQUE(DS_ID,DSTPT_ID);\\012\\012\\012ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT DSTPT_DSTY_FK FOREIGN KEY (DSTY_ID) REFERENCES DATA_SET_TYPES(ID);\\012ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT DSTPT_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT DSTPT_PRTY_FK FOREIGN KEY (PRTY_ID) REFERENCES PROPERTY_TYPES(ID);\\012ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_CVTE_FK FOREIGN KEY (CVTE_ID) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID);\\012ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_DSTPT_FK FOREIGN KEY (DSTPT_ID) REFERENCES DATA_SET_TYPE_PROPERTY_TYPES(ID) ON DELETE CASCADE;\\012ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_DS_FK FOREIGN KEY (DS_ID) REFERENCES DATA(ID);\\012ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_MAPR_FK FOREIGN KEY (MATE_PROP_ID) REFERENCES MATERIALS(ID);\\012\\012ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_CK CHECK \\012\\011((VALUE IS NOT NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NULL) OR \\012\\011 (VALUE IS NULL AND CVTE_ID IS NOT NULL AND MATE_PROP_ID IS NULL) OR\\012\\011 (VALUE IS NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NOT NULL)\\012\\011);\\012\\012CREATE INDEX DSPR_CVTE_FK_I ON DATA_SET_PROPERTIES (CVTE_ID);\\012CREATE INDEX DSPR_DSTPT_FK_I ON DATA_SET_PROPERTIES (DSTPT_ID);\\012CREATE INDEX DSPR_DS_FK_I ON DATA_SET_PROPERTIES (DS_ID);\\012CREATE INDEX DSPR_PERS_FK_I ON DATA_SET_PROPERTIES (PERS_ID_REGISTERER);\\012CREATE INDEX DSTPT_DSTY_FK_I ON DATA_SET_TYPE_PROPERTY_TYPES (DSTY_ID);\\012CREATE INDEX DSTPT_PERS_FK_I ON DATA_SET_TYPE_PROPERTY_TYPES (PERS_ID_REGISTERER);\\012CREATE INDEX DSTPT_PRTY_FK_I ON DATA_SET_TYPE_PROPERTY_TYPES (PRTY_ID);\\012\\012CREATE OR REPLACE FUNCTION DATA_SET_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK() RETURNS trigger AS $$\\012DECLARE\\012   v_type_id  CODE;\\012   v_type_id_prop  CODE;\\012BEGIN\\012   if NEW.mate_prop_id IS NOT NULL then\\012\\011\\011\\011-- find material type id of the property type \\012\\011\\011\\011select pt.maty_prop_id into v_type_id_prop \\012\\011\\011\\011  from data_set_type_property_types dstpt, property_types pt \\012\\011\\011\\011 where NEW.dstpt_id = dstpt.id AND dstpt.prty_id = pt.id;\\012\\011\\011\\012\\011\\011\\011if v_type_id_prop IS NOT NULL then\\012\\011\\011\\011\\011-- find material type id of the material which consists the entity's property value\\012\\011\\011\\011\\011select entity.maty_id into v_type_id \\012\\011\\011\\011\\011  from materials entity\\012\\011\\011\\011\\011 where NEW.mate_prop_id = entity.id;\\012\\011\\011\\011\\011if v_type_id != v_type_id_prop then\\012\\011\\011\\011\\011\\011RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', \\012\\011\\011\\011\\011\\011\\011\\011\\011\\011\\011\\011\\011 NEW.mate_prop_id, v_type_id, v_type_id_prop;\\012\\011\\011\\011\\011end if;\\012\\011\\011\\011end if;\\012   end if;\\012   RETURN NEW;\\012END;\\012$$ LANGUAGE 'plpgsql';\\012\\012CREATE TRIGGER DATA_SET_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK BEFORE INSERT OR UPDATE ON data_set_properties\\012    FOR EACH ROW EXECUTE PROCEDURE DATA_SET_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK();   \\012	\N
-031	source/sql/postgresql/migration/migration-030-031.sql	SUCCESS	2009-04-03 15:21:39.061	-- -------\\012-- Change attachment table names, they should no longer mention the experiment\\012-- -------\\012\\012ALTER TABLE experiment_attachment_contents RENAME TO attachment_contents;\\012ALTER TABLE experiment_attachments RENAME TO attachments;\\012\\012ALTER TABLE EXPERIMENT_ATTACHMENT_ID_SEQ RENAME TO ATTACHMENT_ID_SEQ;\\012ALTER TABLE EXPERIMENT_ATTACHMENT_CONTENT_ID_SEQ RENAME TO ATTACHMENT_CONTENT_ID_SEQ;\\012\\012ALTER INDEX EXAT_EXPE_FK_I RENAME TO ATTA_EXPE_FK_I;\\012ALTER INDEX EXAT_PERS_FK_I RENAME TO ATTA_PERS_FK_I;\\012ALTER INDEX EXAT_EXAC_FK_I RENAME TO ATTA_EXAC_FK_I;\\012\\012-- it's not possible to rename constraints, we drop and create them with different names\\012\\012ALTER TABLE attachments\\012\\011DROP CONSTRAINT exat_cont_fk;\\012ALTER TABLE attachments\\012\\011DROP CONSTRAINT exat_expe_fk;\\012ALTER TABLE attachments\\012\\011DROP CONSTRAINT exat_pers_fk;\\012ALTER TABLE attachments\\012\\011DROP CONSTRAINT exat_pk;\\012\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_pk PRIMARY KEY (id);\\012\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_cont_fk FOREIGN KEY (exac_id) REFERENCES attachment_contents(id);\\012\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_expe_fk FOREIGN KEY (expe_id) REFERENCES experiments(id);\\012\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id);\\012\\012-- -------\\012-- Add an arc connection from attachment to project and sample tables\\012-- -------\\012\\012ALTER TABLE attachments\\012\\011ADD COLUMN samp_id tech_id,\\012\\011ADD COLUMN proj_id tech_id,\\012\\011ALTER COLUMN expe_id DROP NOT NULL;\\012\\011\\012ALTER TABLE attachments\\012\\011DROP CONSTRAINT exat_bk_uk;\\012\\011\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_arc_ck CHECK ((((((expe_id IS NOT NULL) AND (proj_id IS NULL)) AND (samp_id IS NULL)) OR (((expe_id IS NULL) AND (proj_id IS NOT NULL)) AND (samp_id IS NULL))) OR (((expe_id IS NULL) AND (proj_id IS NULL)) AND (samp_id IS NOT NULL))));\\012\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_expe_bk_uk UNIQUE (expe_id, file_name, version);\\012\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_proj_bk_uk UNIQUE (proj_id, file_name, version);\\012\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_samp_bk_uk UNIQUE (samp_id, file_name, version);\\012\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_proj_fk FOREIGN KEY (proj_id) REFERENCES projects(id);\\012\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_samp_fk FOREIGN KEY (samp_id) REFERENCES samples(id);\\012\\012CREATE INDEX ATTA_SAMP_FK_I ON ATTACHMENTS (SAMP_ID);\\012CREATE INDEX ATTA_PROJ_FK_I ON ATTACHMENTS (PROJ_ID);\\012\\012-- -------\\012-- Add new datatypes\\012-- -------\\012\\012insert into data_types\\012(id\\012 ,code\\012 ,description)\\012 values \\012 (nextval('DATA_TYPE_ID_SEQ')\\012 ,'HYPERLINK'\\012 ,'Address of a web page'\\012);\\012\\012insert into data_types\\012(id\\012 ,code\\012 ,description)\\012 values \\012 (nextval('DATA_TYPE_ID_SEQ')\\012 ,'MULTILINE_VARCHAR'\\012 ,'Long text'\\012);\\012	\N
+031	source/sql/postgresql/migration/migration-030-031.sql	SUCCESS	2009-04-03 15:56:37.795	-- -------\\012-- Change attachment table names, they should no longer mention the experiment\\012-- -------\\012\\012ALTER TABLE experiment_attachment_contents RENAME TO attachment_contents;\\012ALTER TABLE experiment_attachments RENAME TO attachments;\\012\\012ALTER TABLE EXPERIMENT_ATTACHMENT_ID_SEQ RENAME TO ATTACHMENT_ID_SEQ;\\012ALTER TABLE EXPERIMENT_ATTACHMENT_CONTENT_ID_SEQ RENAME TO ATTACHMENT_CONTENT_ID_SEQ;\\012\\012ALTER INDEX EXAT_EXPE_FK_I RENAME TO ATTA_EXPE_FK_I;\\012ALTER INDEX EXAT_PERS_FK_I RENAME TO ATTA_PERS_FK_I;\\012ALTER INDEX EXAT_EXAC_FK_I RENAME TO ATTA_EXAC_FK_I;\\012\\012-- it's not possible to rename constraints, we drop and create them with different names\\012\\012ALTER TABLE attachments\\012\\011DROP CONSTRAINT exat_cont_fk;\\012ALTER TABLE attachments\\012\\011DROP CONSTRAINT exat_expe_fk;\\012ALTER TABLE attachments\\012\\011DROP CONSTRAINT exat_pers_fk;\\012ALTER TABLE attachments\\012\\011DROP CONSTRAINT exat_pk;\\012\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_pk PRIMARY KEY (id);\\012\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_cont_fk FOREIGN KEY (exac_id) REFERENCES attachment_contents(id);\\012\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_expe_fk FOREIGN KEY (expe_id) REFERENCES experiments(id);\\012\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_pers_fk FOREIGN KEY (pers_id_registerer) REFERENCES persons(id);\\012\\012-- -------\\012-- Add an arc connection from attachment to project and sample tables\\012-- -------\\012\\012ALTER TABLE attachments\\012\\011ADD COLUMN samp_id tech_id,\\012\\011ADD COLUMN proj_id tech_id,\\012\\011ALTER COLUMN expe_id DROP NOT NULL;\\012\\011\\012ALTER TABLE attachments\\012\\011DROP CONSTRAINT exat_bk_uk;\\012\\011\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_arc_ck CHECK ((((((expe_id IS NOT NULL) AND (proj_id IS NULL)) AND (samp_id IS NULL)) OR (((expe_id IS NULL) AND (proj_id IS NOT NULL)) AND (samp_id IS NULL))) OR (((expe_id IS NULL) AND (proj_id IS NULL)) AND (samp_id IS NOT NULL))));\\012\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_expe_bk_uk UNIQUE (expe_id, file_name, version);\\012\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_proj_bk_uk UNIQUE (proj_id, file_name, version);\\012\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_samp_bk_uk UNIQUE (samp_id, file_name, version);\\012\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_proj_fk FOREIGN KEY (proj_id) REFERENCES projects(id);\\012\\012ALTER TABLE attachments\\012\\011ADD CONSTRAINT atta_samp_fk FOREIGN KEY (samp_id) REFERENCES samples(id);\\012\\012CREATE INDEX ATTA_SAMP_FK_I ON ATTACHMENTS (SAMP_ID);\\012CREATE INDEX ATTA_PROJ_FK_I ON ATTACHMENTS (PROJ_ID);\\012\\012-- -------\\012-- Add modification timestamp to project table to allow edition\\012-- -------\\012\\012ALTER TABLE projects\\012\\011ADD COLUMN modification_timestamp TIME_STAMP DEFAULT CURRENT_TIMESTAMP;\\012\\011\\012-- -------\\012-- Add new datatypes\\012-- -------\\012\\012insert into data_types\\012(id\\012 ,code\\012 ,description)\\012 values \\012 (nextval('DATA_TYPE_ID_SEQ')\\012 ,'HYPERLINK'\\012 ,'Address of a web page'\\012);\\012\\012insert into data_types\\012(id\\012 ,code\\012 ,description)\\012 values \\012 (nextval('DATA_TYPE_ID_SEQ')\\012 ,'MULTILINE_VARCHAR'\\012 ,'Long text'\\012);\\012	\N
diff --git a/openbis/sourceTest/sql/postgresql/031/032=projects.tsv b/openbis/sourceTest/sql/postgresql/031/032=projects.tsv
index dbb6642d7e1..34537ddaeb5 100644
--- a/openbis/sourceTest/sql/postgresql/031/032=projects.tsv
+++ b/openbis/sourceTest/sql/postgresql/031/032=projects.tsv
@@ -1,4 +1,4 @@
-1	DEFAULT	1	\N	\N	2	2008-11-05 09:18:13.344+01	\N
-2	TESTPROJ	2	\N	\N	2	2008-11-05 09:18:14.967+01	\N
-3	NEMO	1	\N	\N	2	2008-11-05 09:21:43.172+01	\N
-4	NOE	1	\N	\N	2	2008-11-05 09:21:43.312+01	\N
+1	DEFAULT	1	\N	\N	2	2008-11-05 09:18:13.344+01	\N	2009-04-03 15:56:37.675094+02
+2	TESTPROJ	2	\N	\N	2	2008-11-05 09:18:14.967+01	\N	2009-04-03 15:56:37.675094+02
+3	NEMO	1	\N	\N	2	2008-11-05 09:21:43.172+01	\N	2009-04-03 15:56:37.675094+02
+4	NOE	1	\N	\N	2	2008-11-05 09:21:43.312+01	\N	2009-04-03 15:56:37.675094+02
diff --git a/openbis/sourceTest/sql/postgresql/031/schema-031.sql b/openbis/sourceTest/sql/postgresql/031/schema-031.sql
index 6393da93ff5..5d94da36178 100644
--- a/openbis/sourceTest/sql/postgresql/031/schema-031.sql
+++ b/openbis/sourceTest/sql/postgresql/031/schema-031.sql
@@ -678,7 +678,8 @@ CREATE TABLE projects (
     description description_1000,
     pers_id_registerer tech_id NOT NULL,
     registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
-    dast_id tech_id
+    dast_id tech_id,
+    modification_timestamp time_stamp DEFAULT now()
 );
 CREATE SEQUENCE property_type_id_seq
     INCREMENT BY 1
-- 
GitLab