diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DatabaseVersionHolder.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DatabaseVersionHolder.java index f6e970782a50546b96926e2a5db5368b48783720..63bf1e4eebf90bf71e789f71ae7827bd9b17c793 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DatabaseVersionHolder.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DatabaseVersionHolder.java @@ -24,7 +24,7 @@ package ch.systemsx.cisd.openbis.generic.server.dataaccess.db; public final class DatabaseVersionHolder { /** Current version of the database. */ - private static final String DATABASE_VERSION = "087"; // S117.3 + private static final String DATABASE_VERSION = "088"; // S118 private DatabaseVersionHolder() { diff --git a/openbis/source/sql/generic/088/data-088.sql b/openbis/source/sql/generic/088/data-088.sql new file mode 100644 index 0000000000000000000000000000000000000000..a07fc0f986b505056d35c8a56d720231c8b70a5d --- /dev/null +++ b/openbis/source/sql/generic/088/data-088.sql @@ -0,0 +1,367 @@ +---------------------------------------------------------------------------- +-- Purpose: Insert an initial data set into the table DATABASE_INSTANCES +---------------------------------------------------------------------------- + +INSERT INTO database_instances( + id + , code + , uuid + , is_original_source) + VALUES ( nextval('DATABASE_INSTANCE_ID_SEQ') + , 'SYSTEM_DEFAULT' + , 'SYSTEM_DEFAULT' + , 'T'); + +---------------------------------------------------------------------- +-- Purpose: Insert an initial data set into the table PERSONS +----------------------------------------------------------------------- + +insert into persons +(id +,first_name +,last_name +,user_id +,email +,dbin_id) +values +(nextval('PERSON_ID_SEQ') +,'' +,'System User' +,'system' +,'' +,(select id from database_instances where code = 'SYSTEM_DEFAULT') ); + +----------------------------------------------------------------------------------- +-- Purpose: Create Controlled Vocabulary STORAGE_FORMAT +----------------------------------------------------------------------------------- +insert into controlled_vocabularies + ( id + , code + , is_internal_namespace + , description + , pers_id_registerer + , is_managed_internally + , dbin_id) +values (nextval('CONTROLLED_VOCABULARY_ID_SEQ') + , 'STORAGE_FORMAT' + , true + , 'The on-disk storage format of a data set' + , (select id from persons where user_id ='system') + , true + , (select id from database_instances where code = 'SYSTEM_DEFAULT')); + + +----------------------------------------------------------------------------------- +-- Purpose: Create Controlled Vocabulary Terms for STORAGE_FORMAT +----------------------------------------------------------------------------------- +insert into controlled_vocabulary_terms + ( id + , code + , covo_id + , pers_id_registerer + , ordinal ) +values (nextval('CVTE_ID_SEQ') + , 'PROPRIETARY' + , (select id from controlled_vocabularies where code = 'STORAGE_FORMAT' and is_internal_namespace = true) + , (select id from persons where user_id ='system') + , 1); + +insert into controlled_vocabulary_terms + ( id + , code + , covo_id + , pers_id_registerer + , ordinal) +values (nextval('CVTE_ID_SEQ') + , 'BDS_DIRECTORY' + , (select id from controlled_vocabularies where code = 'STORAGE_FORMAT' and is_internal_namespace = true) + , (select id from persons where user_id ='system') + , 2); + +------------------------------------------------------------------ +-- Purpose: Insert an initial data set into the table DATA_TYPES +------------------------------------------------------------------ + +insert into data_types +(id +,code +,description) +values +(nextval('DATA_TYPE_ID_SEQ') +,'VARCHAR' +,'Short text' +); + +insert into data_types +(id + ,code + ,description) + values + (nextval('DATA_TYPE_ID_SEQ') + ,'MULTILINE_VARCHAR' + ,'Long text' +); + +insert into data_types +(id +,code +,description) +values +(nextval('DATA_TYPE_ID_SEQ') +,'INTEGER' +,'Integer number' +); + +insert into data_types +(id +,code +,description) +values +(nextval('DATA_TYPE_ID_SEQ') +,'REAL' +,'Real number, i.e. an inexact, variable-precision numeric type' +); + +insert into data_types +(id +,code +,description) +values +(nextval('DATA_TYPE_ID_SEQ') +,'BOOLEAN' +,'True or False' +); + +insert into data_types +(id +,code +,description) +values +(nextval('DATA_TYPE_ID_SEQ') +,'TIMESTAMP' +,'Both date and time. Format: yyyy-mm-dd hh:mm:ss' +); + +insert into data_types +(id + ,code + ,description) + values + (nextval('DATA_TYPE_ID_SEQ') + ,'CONTROLLEDVOCABULARY' + ,'Controlled Vocabulary' +); + +insert into data_types +(id + ,code + ,description) + values + (nextval('DATA_TYPE_ID_SEQ') + ,'MATERIAL' + ,'Reference to a material' +); + +insert into data_types +(id + ,code + ,description) + values + (nextval('DATA_TYPE_ID_SEQ') + ,'HYPERLINK' + ,'Address of a web page' +); + +insert into data_types +(id + ,code + ,description) + values + (nextval('DATA_TYPE_ID_SEQ') + ,'XML' + ,'XML document' +); + +---------------------------------------------------------------------- +-- Purpose: Insert an initial data set into the table PROPERTY_TYPES +----------------------------------------------------------------------- + +insert into property_types +(id +,code +,description +,label +,daty_id +,pers_id_registerer +,dbin_id) +values +(nextval('PROPERTY_TYPE_ID_SEQ') +,'DESCRIPTION' +,'A Description' +,'Description' +,(select id from data_types where code ='VARCHAR') +,(select id from persons where user_id ='system') +,(select id from database_instances where code = 'SYSTEM_DEFAULT') +); + +-------------------------------------------------------------------------- +-- Purpose: Insert an initial data set into the table DATA_SET_TYPES +-------------------------------------------------------------------------- + +insert into data_set_types +(id +,code +,description +,dbin_id) +values +(nextval('DATA_SET_TYPE_ID_SEQ') +,'UNKNOWN' +,'Unknown' +,(select id from database_instances where code = 'SYSTEM_DEFAULT') +); + +------------------------------------------------------------------------- +-- Purpose: Insert an initial data set into the table FILE_FORMAT_TYPES +------------------------------------------------------------------------- + +insert into file_format_types +(id +,code +,description +,dbin_id) +values +(nextval('FILE_FORMAT_TYPE_ID_SEQ') +,'HDF5' +,'Hierarchical Data Format File, version 5' +,(select id from database_instances where code = 'SYSTEM_DEFAULT') +); + +insert into file_format_types +(id +,code +,description +,dbin_id) +values +(nextval('FILE_FORMAT_TYPE_ID_SEQ') +,'PROPRIETARY' +,'Proprietary Format File' +,(select id from database_instances where code = 'SYSTEM_DEFAULT') +); + +insert into file_format_types +(id +,code +,description +,dbin_id) +values +(nextval('FILE_FORMAT_TYPE_ID_SEQ') +,'SRF' +,'Sequence Read Format File' +,(select id from database_instances where code = 'SYSTEM_DEFAULT') +); + +insert into file_format_types +(id +,code +,description +,dbin_id) +values +(nextval('FILE_FORMAT_TYPE_ID_SEQ') +,'TIFF' +,'TIFF File' +,(select id from database_instances where code = 'SYSTEM_DEFAULT') +); + +insert into file_format_types +(id +,code +,description +,dbin_id) +values +(nextval('FILE_FORMAT_TYPE_ID_SEQ') +,'TSV' +,'Tab Separated Values File' +,(select id from database_instances where code = 'SYSTEM_DEFAULT') +); + +insert into file_format_types +(id +,code +,description +,dbin_id) +values +(nextval('FILE_FORMAT_TYPE_ID_SEQ') +,'XML' +,'XML File' +,(select id from database_instances where code = 'SYSTEM_DEFAULT') +); + +--------------------------------------------------------------------- +-- Purpose: Insert an initial data set into the table LOCATOR_TYPES +--------------------------------------------------------------------- + +insert into locator_types +(id +,code +,description) +values +(nextval('LOCATOR_TYPE_ID_SEQ') +,'RELATIVE_LOCATION' +,'Relative Location' +); + +--------------------------------------------------------------------- +-- Purpose: Insert an initial data into table RELATIONSHIP_TYPES +--------------------------------------------------------------------- + +insert into relationship_types +(id, +code, +label, +parent_label, +child_label, +description, +pers_id_registerer, +is_managed_internally, +is_internal_namespace, +dbin_id) +values +( +nextval('RELATIONSHIP_TYPE_ID_SEQ'), +'PARENT_CHILD', +'Parent - Child', +'Parent', +'Child', +'Parent - Child relationship', +(select id from persons where user_id ='system'), +'T', +'T', +(select id from database_instances where code = 'SYSTEM_DEFAULT') +); + +insert into relationship_types +(id, +code, +label, +parent_label, +child_label, +description, +pers_id_registerer, +is_managed_internally, +is_internal_namespace, +dbin_id) +values +( +nextval('RELATIONSHIP_TYPE_ID_SEQ'), +'PLATE_CONTROL_LAYOUT', +'Plate - Control Layout', +'Plate', +'Control Layout', +'Plate - Control Layout relationship', +(select id from persons where user_id ='system'), +'T', +'T', +(select id from database_instances where code = 'SYSTEM_DEFAULT') +); + + diff --git a/openbis/source/sql/generic/088/schema-088.sql b/openbis/source/sql/generic/088/schema-088.sql new file mode 100644 index 0000000000000000000000000000000000000000..4ecd1bd3a8a2e7b826bf94562279770524be0587 --- /dev/null +++ b/openbis/source/sql/generic/088/schema-088.sql @@ -0,0 +1,559 @@ +-- Creating tables + +CREATE TABLE CONTROLLED_VOCABULARIES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL,IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F',IS_INTERNAL_NAMESPACE BOOLEAN_CHAR NOT NULL DEFAULT 'F',DBIN_ID TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, IS_CHOSEN_FROM_LIST BOOLEAN_CHAR NOT NULL DEFAULT TRUE, SOURCE_URI CHARACTER VARYING(250)); +CREATE TABLE CONTROLLED_VOCABULARY_TERMS (ID TECH_ID NOT NULL,CODE OBJECT_NAME NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,COVO_ID TECH_ID NOT NULL,PERS_ID_REGISTERER TECH_ID NOT NULL,LABEL COLUMN_LABEL, DESCRIPTION DESCRIPTION_2000, ORDINAL ORDINAL_INT NOT NULL, IS_OFFICIAL BOOLEAN_CHAR NOT NULL DEFAULT 'T'); +CREATE TABLE DATA_ALL (ID TECH_ID NOT NULL,CODE CODE,DSTY_ID TECH_ID NOT NULL,DAST_ID TECH_ID NOT NULL,EXPE_ID TECH_ID NOT NULL,DATA_PRODUCER_CODE CODE,PRODUCTION_TIMESTAMP TIME_STAMP,SAMP_ID TECH_ID,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID,IS_PLACEHOLDER BOOLEAN_CHAR DEFAULT 'F',IS_VALID BOOLEAN_CHAR DEFAULT 'T', MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, IS_DERIVED BOOLEAN_CHAR NOT NULL, CTNR_ORDER INTEGER, CTNR_ID TECH_ID DEFAULT NULL,DEL_ID TECH_ID); +CREATE TABLE DATABASE_INSTANCES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,UUID CODE NOT NULL,IS_ORIGINAL_SOURCE BOOLEAN_CHAR NOT NULL DEFAULT 'F',REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP); +CREATE TABLE DATA_SET_RELATIONSHIPS_ALL (DATA_ID_PARENT TECH_ID NOT NULL,DATA_ID_CHILD TECH_ID NOT NULL); +CREATE TABLE DATA_STORES (ID TECH_ID NOT NULL,DBIN_ID TECH_ID NOT NULL,CODE CODE NOT NULL,DOWNLOAD_URL VARCHAR(1024) NOT NULL,REMOTE_URL VARCHAR(250) NOT NULL,SESSION_TOKEN VARCHAR(50) NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, IS_ARCHIVER_CONFIGURED BOOLEAN_CHAR NOT NULL DEFAULT 'F'); +CREATE TABLE DATA_STORE_SERVICES (ID TECH_ID NOT NULL, KEY VARCHAR(256) NOT NULL, LABEL VARCHAR(256) NOT NULL, KIND DATA_STORE_SERVICE_KIND NOT NULL, DATA_STORE_ID TECH_ID NOT NULL, REPORTING_PLUGIN_TYPE DATA_STORE_SERVICE_REPORTING_PLUGIN_TYPE); +CREATE TABLE DATA_STORE_SERVICE_DATA_SET_TYPES (DATA_STORE_SERVICE_ID TECH_ID NOT NULL, DATA_SET_TYPE_ID TECH_ID NOT NULL); +CREATE TABLE DATA_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000 NOT NULL); +CREATE TABLE EVENTS (ID TECH_ID NOT NULL,EVENT_TYPE EVENT_TYPE NOT NULL,DESCRIPTION TEXT_VALUE,REASON DESCRIPTION_2000,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, entity_type VARCHAR(80) NOT NULL, identifiers TEXT_VALUE NOT NULL); +CREATE TABLE EXPERIMENTS_ALL (ID TECH_ID NOT NULL,PERM_ID CODE NOT NULL,CODE CODE NOT NULL,EXTY_ID TECH_ID NOT NULL,MATE_ID_STUDY_OBJECT 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, PROJ_ID TECH_ID NOT NULL,DEL_ID TECH_ID,IS_PUBLIC BOOLEAN_CHAR NOT NULL DEFAULT 'F'); +CREATE TABLE ATTACHMENTS (ID TECH_ID NOT NULL,EXPE_ID TECH_ID,SAMP_ID TECH_ID,PROJ_ID TECH_ID,EXAC_ID TECH_ID NOT NULL,FILE_NAME FILE_NAME NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,VERSION INTEGER NOT NULL,PERS_ID_REGISTERER TECH_ID NOT NULL, title TITLE_100, description DESCRIPTION_2000); +CREATE TABLE ATTACHMENT_CONTENTS (ID TECH_ID NOT NULL,VALUE FILE NOT NULL); +CREATE TABLE EXPERIMENT_PROPERTIES (ID TECH_ID NOT NULL,EXPE_ID TECH_ID NOT NULL,ETPT_ID TECH_ID NOT NULL,VALUE TEXT_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); +CREATE TABLE EXPERIMENT_PROPERTIES_HISTORY (ID TECH_ID NOT NULL, EXPE_ID TECH_ID NOT NULL, ETPT_ID TECH_ID NOT NULL, VALUE TEXT_VALUE, CVTE_ID TECH_ID, MATE_PROP_ID TECH_ID, VALID_UNTIL_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP); +CREATE TABLE EXPERIMENT_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000,DBIN_ID TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP); +CREATE TABLE EXPERIMENT_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,EXTY_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, ORDINAL ORDINAL_INT NOT NULL, SECTION DESCRIPTION_2000,SCRIPT_ID TECH_ID,IS_SHOWN_EDIT BOOLEAN_CHAR NOT NULL DEFAULT 'T'); +CREATE TABLE EXTERNAL_DATA (DATA_ID TECH_ID NOT NULL,SHARE_ID CODE,SIZE ORDINAL_INT,LOCATION VARCHAR(1024) NOT NULL,FFTY_ID TECH_ID NOT NULL,LOTY_ID TECH_ID NOT NULL,CVTE_ID_STOR_FMT TECH_ID NOT NULL,IS_COMPLETE BOOLEAN_CHAR_OR_UNKNOWN NOT NULL DEFAULT 'U',CVTE_ID_STORE TECH_ID, STATUS ARCHIVING_STATUS NOT NULL DEFAULT 'AVAILABLE', PRESENT_IN_ARCHIVE BOOLEAN_CHAR DEFAULT 'F', SPEED_HINT INTEGER NOT NULL DEFAULT -50); +CREATE TABLE FILE_FORMAT_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000,DBIN_ID TECH_ID NOT NULL); +CREATE TABLE GRID_CUSTOM_COLUMNS (ID TECH_ID NOT NULL, DBIN_ID TECH_ID NOT NULL, CODE VARCHAR(200) NOT NULL, LABEL column_label NOT NULL, DESCRIPTION DESCRIPTION_2000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_REGISTERER TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, EXPRESSION GRID_EXPRESSION NOT NULL, IS_PUBLIC BOOLEAN NOT NULL, GRID_ID GRID_ID NOT NULL); +CREATE TABLE SPACES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DBIN_ID TECH_ID NOT NULL,DESCRIPTION DESCRIPTION_2000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL); +CREATE TABLE DELETIONS (ID TECH_ID NOT NULL,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,REASON DESCRIPTION_2000 NOT NULL); +CREATE TABLE LOCATOR_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000); +CREATE TABLE MATERIALS (ID TECH_ID NOT NULL,CODE CODE NOT NULL,MATY_ID TECH_ID NOT NULL,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, DBIN_ID TECH_ID NOT NULL); +CREATE TABLE MATERIAL_PROPERTIES (ID TECH_ID NOT NULL,MATE_ID TECH_ID NOT NULL,MTPT_ID TECH_ID NOT NULL,VALUE TEXT_VALUE,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, PERS_ID_REGISTERER TECH_ID NOT NULL,CVTE_ID TECH_ID, MATE_PROP_ID TECH_ID); +CREATE TABLE MATERIAL_PROPERTIES_HISTORY (ID TECH_ID NOT NULL, MATE_ID TECH_ID NOT NULL, MTPT_ID TECH_ID NOT NULL, VALUE TEXT_VALUE, CVTE_ID TECH_ID, MATE_PROP_ID TECH_ID, VALID_UNTIL_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP); +CREATE TABLE MATERIAL_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000,DBIN_ID TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP); +CREATE TABLE MATERIAL_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,MATY_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',REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL, ORDINAL ORDINAL_INT NOT NULL, SECTION DESCRIPTION_2000,SCRIPT_ID TECH_ID,IS_SHOWN_EDIT BOOLEAN_CHAR NOT NULL DEFAULT 'T'); +CREATE TABLE DATA_SET_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000,DBIN_ID TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, MAIN_DS_PATTERN VARCHAR(300), MAIN_DS_PATH VARCHAR(1000), IS_CONTAINER BOOLEAN_CHAR DEFAULT false); +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,SPACE_ID TECH_ID,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID, DISPLAY_SETTINGS FILE); +CREATE TABLE PROJECTS (ID TECH_ID NOT NULL,CODE CODE NOT NULL,SPACE_ID TECH_ID NOT NULL,PERS_ID_LEADER TECH_ID,DESCRIPTION DESCRIPTION_2000,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP); +CREATE TABLE PROPERTY_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000 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, SCHEMA TEXT_VALUE, TRANSFORMATION TEXT_VALUE); +CREATE TABLE ROLE_ASSIGNMENTS (ID TECH_ID NOT NULL,ROLE_CODE AUTHORIZATION_ROLE NOT NULL,SPACE_ID TECH_ID,DBIN_ID TECH_ID,PERS_ID_GRANTEE TECH_ID, AG_ID_GRANTEE TECH_ID, PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP); +CREATE TABLE SAMPLES_ALL (ID TECH_ID NOT NULL,PERM_ID CODE NOT NULL,CODE CODE NOT NULL,EXPE_ID 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,DEL_ID TECH_ID,DBIN_ID TECH_ID,SPACE_ID TECH_ID,SAMP_ID_PART_OF TECH_ID); +CREATE TABLE SAMPLE_PROPERTIES (ID TECH_ID NOT NULL,SAMP_ID TECH_ID NOT NULL,STPT_ID TECH_ID NOT NULL,VALUE TEXT_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); +CREATE TABLE SAMPLE_PROPERTIES_HISTORY (ID TECH_ID NOT NULL, SAMP_ID TECH_ID NOT NULL, STPT_ID TECH_ID NOT NULL, VALUE TEXT_VALUE, CVTE_ID TECH_ID, MATE_PROP_ID TECH_ID, VALID_UNTIL_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP); +CREATE TABLE SAMPLE_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_2000,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, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, is_auto_generated_code BOOLEAN_CHAR NOT NULL DEFAULT 'F', generated_code_prefix CODE NOT NULL DEFAULT 'S', is_subcode_unique BOOLEAN_CHAR NOT NULL DEFAULT 'F'); +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', ORDINAL ORDINAL_INT NOT NULL, SECTION DESCRIPTION_2000,SCRIPT_ID TECH_ID,IS_SHOWN_EDIT BOOLEAN_CHAR NOT NULL DEFAULT 'T'); + +CREATE TABLE DATA_SET_PROPERTIES (ID TECH_ID NOT NULL,DS_ID TECH_ID NOT NULL,DSTPT_ID TECH_ID NOT NULL,VALUE TEXT_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); +CREATE TABLE DATA_SET_PROPERTIES_HISTORY (ID TECH_ID NOT NULL, DS_ID TECH_ID NOT NULL, DSTPT_ID TECH_ID NOT NULL, VALUE TEXT_VALUE, CVTE_ID TECH_ID, MATE_PROP_ID TECH_ID, VALID_UNTIL_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP); +CREATE 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, ORDINAL ORDINAL_INT NOT NULL, SECTION DESCRIPTION_2000,SCRIPT_ID TECH_ID, IS_SHOWN_EDIT BOOLEAN_CHAR NOT NULL DEFAULT 'T'); + +CREATE TABLE AUTHORIZATION_GROUPS (ID TECH_ID NOT NULL, DBIN_ID TECH_ID NOT NULL, CODE CODE NOT NULL, DESCRIPTION DESCRIPTION_2000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_REGISTERER TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP); +CREATE TABLE AUTHORIZATION_GROUP_PERSONS (AG_ID TECH_ID NOT NULL, PERS_ID TECH_ID NOT NULL); + +CREATE TABLE FILTERS (ID TECH_ID NOT NULL, DBIN_ID TECH_ID NOT NULL, NAME VARCHAR(200) NOT NULL, DESCRIPTION DESCRIPTION_2000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_REGISTERER TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, EXPRESSION VARCHAR(2000) NOT NULL, IS_PUBLIC BOOLEAN NOT NULL, GRID_ID VARCHAR(200) NOT NULL); +CREATE TABLE QUERIES (ID TECH_ID NOT NULL, DBIN_ID TECH_ID NOT NULL, NAME VARCHAR(200) NOT NULL, DESCRIPTION DESCRIPTION_2000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_REGISTERER TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, EXPRESSION VARCHAR(2000) NOT NULL, IS_PUBLIC BOOLEAN NOT NULL, QUERY_TYPE QUERY_TYPE NOT NULL, ENTITY_TYPE_CODE CODE, DB_KEY CODE NOT NULL DEFAULT '1'); + +CREATE TABLE relationship_types (id TECH_ID NOT NULL, code CODE NOT NULL, label COLUMN_LABEL, parent_label COLUMN_LABEL, child_label COLUMN_LABEL, description DESCRIPTION_2000, registration_timestamp TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, pers_id_registerer TECH_ID NOT NULL, is_managed_internally BOOLEAN_CHAR NOT NULL DEFAULT 'F', is_internal_namespace BOOLEAN_CHAR NOT NULL DEFAULT 'F', dbin_id TECH_ID NOT NULL); +CREATE TABLE sample_relationships_all (id TECH_ID NOT NULL, sample_id_parent TECH_ID NOT NULL, relationship_id TECH_ID NOT NULL, sample_id_child TECH_ID NOT NULL); + +CREATE TABLE scripts (ID TECH_ID NOT NULL,DBIN_ID TECH_ID NOT NULL,NAME VARCHAR(200) NOT NULL, SCRIPT_TYPE SCRIPT_TYPE NOT NULL, DESCRIPTION DESCRIPTION_2000,SCRIPT TEXT_VALUE NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL,ENTITY_KIND ENTITY_KIND); + +CREATE TABLE CORE_PLUGINS (ID TECH_ID NOT NULL, NAME VARCHAR(200) NOT NULL, VERSION INTEGER NOT NULL, REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MASTER_REG_SCRIPT TEXT_VALUE); + +-- Creating views - copied from schema generated for tests, '*' can't be used because of PgDiffViews limitation in view comparison + +CREATE VIEW data AS + SELECT id, code, dsty_id, dast_id, expe_id, data_producer_code, production_timestamp, samp_id, registration_timestamp, pers_id_registerer, is_placeholder, is_valid, modification_timestamp, is_derived, ctnr_order, ctnr_id, del_id + FROM data_all + WHERE del_id IS NULL; +CREATE VIEW data_deleted AS + SELECT id, code, dsty_id, dast_id, expe_id, data_producer_code, production_timestamp, samp_id, registration_timestamp, pers_id_registerer, is_placeholder, is_valid, modification_timestamp, is_derived, ctnr_order, ctnr_id, del_id + FROM data_all + WHERE del_id IS NOT NULL; + +CREATE VIEW experiments AS + SELECT id, perm_id, code, exty_id, mate_id_study_object, pers_id_registerer, registration_timestamp, modification_timestamp, proj_id, del_id, is_public + FROM experiments_all + WHERE del_id IS NULL; +CREATE VIEW experiments_deleted AS + SELECT id, perm_id, code, exty_id, mate_id_study_object, pers_id_registerer, registration_timestamp, modification_timestamp, proj_id, del_id, is_public + FROM experiments_all + WHERE del_id IS NOT NULL; + +CREATE VIEW samples AS + SELECT id, perm_id, code, expe_id, saty_id, registration_timestamp, modification_timestamp, pers_id_registerer, del_id, dbin_id, space_id, samp_id_part_of + FROM samples_all + WHERE del_id IS NULL; +CREATE VIEW samples_deleted AS + SELECT id, perm_id, code, expe_id, saty_id, registration_timestamp, modification_timestamp, pers_id_registerer, del_id, dbin_id, space_id, samp_id_part_of + FROM samples_all + WHERE del_id IS NOT NULL; + +CREATE VIEW data_set_relationships AS + SELECT data_id_parent, data_id_child + FROM data_set_relationships_all + JOIN data_all parent ON data_id_parent = parent.id + JOIN data_all child ON data_id_child = child.id + WHERE parent.del_id IS NULL and child.del_id is NULL; + +CREATE VIEW sample_relationships AS + SELECT s.id as id, sample_id_parent, relationship_id, sample_id_child + FROM sample_relationships_all s + JOIN samples_all parent ON sample_id_parent = parent.id + JOIN samples_all child ON sample_id_child = child.id + WHERE parent.del_id IS NULL and child.del_id is NULL; + + +-- Creating sequences + +CREATE SEQUENCE CONTROLLED_VOCABULARY_ID_SEQ; +CREATE SEQUENCE CVTE_ID_SEQ; +CREATE SEQUENCE DATABASE_INSTANCE_ID_SEQ; +CREATE SEQUENCE DATA_ID_SEQ; +CREATE SEQUENCE DATA_SET_RELATIONSHIP_ID_SEQ; +CREATE SEQUENCE DATA_STORE_ID_SEQ; +CREATE SEQUENCE DATA_STORE_SERVICES_ID_SEQ; +CREATE SEQUENCE DATA_TYPE_ID_SEQ; +CREATE SEQUENCE ETPT_ID_SEQ; +CREATE SEQUENCE EVENT_ID_SEQ; +CREATE SEQUENCE ATTACHMENT_ID_SEQ; +CREATE SEQUENCE ATTACHMENT_CONTENT_ID_SEQ; +CREATE SEQUENCE EXPERIMENT_ID_SEQ; +CREATE SEQUENCE EXPERIMENT_PROPERTY_ID_SEQ; +CREATE SEQUENCE EXPERIMENT_TYPE_ID_SEQ; +CREATE SEQUENCE FILE_FORMAT_TYPE_ID_SEQ; +CREATE SEQUENCE SPACE_ID_SEQ; +CREATE SEQUENCE DELETION_ID_SEQ; +CREATE SEQUENCE LOCATOR_TYPE_ID_SEQ; +CREATE SEQUENCE MATERIAL_ID_SEQ; +CREATE SEQUENCE MATERIAL_PROPERTY_ID_SEQ; +CREATE SEQUENCE MATERIAL_TYPE_ID_SEQ; +CREATE SEQUENCE MTPT_ID_SEQ; +CREATE SEQUENCE DATA_SET_TYPE_ID_SEQ; +CREATE SEQUENCE PERSON_ID_SEQ; +CREATE SEQUENCE PROJECT_ID_SEQ; +CREATE SEQUENCE PROPERTY_TYPE_ID_SEQ; +CREATE SEQUENCE ROLE_ASSIGNMENT_ID_SEQ; +CREATE SEQUENCE SAMPLE_ID_SEQ; +CREATE SEQUENCE SAMPLE_PROPERTY_ID_SEQ; +CREATE SEQUENCE SAMPLE_TYPE_ID_SEQ; +CREATE SEQUENCE STPT_ID_SEQ; +CREATE SEQUENCE DATA_SET_PROPERTY_ID_SEQ; +CREATE SEQUENCE DSTPT_ID_SEQ; +CREATE SEQUENCE CODE_SEQ; +CREATE SEQUENCE PERM_ID_SEQ; +CREATE SEQUENCE AUTHORIZATION_GROUP_ID_SEQ; +CREATE SEQUENCE FILTER_ID_SEQ; +CREATE SEQUENCE GRID_CUSTOM_COLUMNS_ID_SEQ; +CREATE SEQUENCE QUERY_ID_SEQ; +CREATE SEQUENCE RELATIONSHIP_TYPE_ID_SEQ; +CREATE SEQUENCE SAMPLE_RELATIONSHIP_ID_SEQ; +CREATE SEQUENCE SCRIPT_ID_SEQ; +CREATE SEQUENCE CORE_PLUGIN_ID_SEQ; + +-- Creating primary key constraints + +ALTER TABLE CONTROLLED_VOCABULARIES ADD CONSTRAINT COVO_PK PRIMARY KEY(ID); +ALTER TABLE CONTROLLED_VOCABULARY_TERMS ADD CONSTRAINT CVTE_PK PRIMARY KEY(ID); +ALTER TABLE DATA_ALL ADD CONSTRAINT DATA_PK PRIMARY KEY(ID); +ALTER TABLE DATABASE_INSTANCES ADD CONSTRAINT DBIN_PK PRIMARY KEY(ID); +ALTER TABLE DATA_STORES ADD CONSTRAINT DAST_PK PRIMARY KEY(ID); +ALTER TABLE DATA_STORE_SERVICES ADD CONSTRAINT DSSE_PK PRIMARY KEY(ID); +ALTER TABLE DATA_TYPES ADD CONSTRAINT DATY_PK PRIMARY KEY(ID); +ALTER TABLE EVENTS ADD CONSTRAINT EVNT_PK PRIMARY KEY(ID); +ALTER TABLE EXPERIMENTS_ALL ADD CONSTRAINT EXPE_PK PRIMARY KEY(ID); +ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_PK PRIMARY KEY(ID); +ALTER TABLE ATTACHMENT_CONTENTS ADD CONSTRAINT EXAC_PK PRIMARY KEY(ID); +ALTER TABLE EXPERIMENT_PROPERTIES ADD CONSTRAINT EXPR_PK PRIMARY KEY(ID); +ALTER TABLE EXPERIMENT_PROPERTIES_HISTORY ADD CONSTRAINT EXPRH_PK PRIMARY KEY(ID); +ALTER TABLE EXPERIMENT_TYPES ADD CONSTRAINT EXTY_PK PRIMARY KEY(ID); +ALTER TABLE EXPERIMENT_TYPE_PROPERTY_TYPES ADD CONSTRAINT ETPT_PK PRIMARY KEY(ID); +ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_PK PRIMARY KEY(DATA_ID); +ALTER TABLE FILE_FORMAT_TYPES ADD CONSTRAINT FFTY_PK PRIMARY KEY(ID); +ALTER TABLE SPACES ADD CONSTRAINT SPACE_PK PRIMARY KEY(ID); +ALTER TABLE DELETIONS ADD CONSTRAINT DEL_PK PRIMARY KEY(ID); +ALTER TABLE LOCATOR_TYPES ADD CONSTRAINT LOTY_PK PRIMARY KEY(ID); +ALTER TABLE MATERIALS ADD CONSTRAINT MATE_PK PRIMARY KEY(ID); +ALTER TABLE MATERIAL_PROPERTIES ADD CONSTRAINT MAPR_PK PRIMARY KEY(ID); +ALTER TABLE MATERIAL_PROPERTIES_HISTORY ADD CONSTRAINT MAPRH_PK PRIMARY KEY(ID); +ALTER TABLE MATERIAL_TYPES ADD CONSTRAINT MATY_PK PRIMARY KEY(ID); +ALTER TABLE MATERIAL_TYPE_PROPERTY_TYPES ADD CONSTRAINT MTPT_PK PRIMARY KEY(ID); +ALTER TABLE DATA_SET_TYPES ADD CONSTRAINT DSTY_PK PRIMARY KEY(ID); +ALTER TABLE PERSONS ADD CONSTRAINT PERS_PK PRIMARY KEY(ID); +ALTER TABLE PROJECTS ADD CONSTRAINT PROJ_PK PRIMARY KEY(ID); +ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_PK PRIMARY KEY(ID); +ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_PK PRIMARY KEY(ID); +ALTER TABLE SAMPLES_ALL ADD CONSTRAINT SAMP_PK PRIMARY KEY(ID); +ALTER TABLE SAMPLE_PROPERTIES ADD CONSTRAINT SAPR_PK PRIMARY KEY(ID); +ALTER TABLE SAMPLE_PROPERTIES_HISTORY ADD CONSTRAINT SAPRH_PK PRIMARY KEY(ID); +ALTER TABLE SAMPLE_TYPES ADD CONSTRAINT SATY_PK PRIMARY KEY(ID); +ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ADD CONSTRAINT STPT_PK PRIMARY KEY(ID); +ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT DSTPT_PK PRIMARY KEY(ID); +ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_PK PRIMARY KEY(ID); +ALTER TABLE DATA_SET_PROPERTIES_HISTORY ADD CONSTRAINT DSPRH_PK PRIMARY KEY(ID); +ALTER TABLE AUTHORIZATION_GROUPS ADD CONSTRAINT AG_PK PRIMARY KEY(ID); +ALTER TABLE AUTHORIZATION_GROUP_PERSONS ADD CONSTRAINT AGP_PK PRIMARY KEY(PERS_ID,AG_ID); +ALTER TABLE FILTERS ADD CONSTRAINT FILT_PK PRIMARY KEY(ID); +ALTER TABLE GRID_CUSTOM_COLUMNS ADD CONSTRAINT GRID_CUSTOM_COLUMNS_PK PRIMARY KEY(ID); +ALTER TABLE QUERIES ADD CONSTRAINT QUER_PK PRIMARY KEY(ID); +ALTER TABLE relationship_types ADD CONSTRAINT rety_pk PRIMARY KEY (id); +ALTER TABLE sample_relationships_all ADD CONSTRAINT sare_pk PRIMARY KEY (id); +ALTER TABLE SCRIPTS ADD CONSTRAINT SCRI_PK PRIMARY KEY(ID); + +-- Creating unique constraints + +ALTER TABLE CONTROLLED_VOCABULARIES ADD CONSTRAINT COVO_BK_UK UNIQUE(CODE,IS_INTERNAL_NAMESPACE,DBIN_ID); +ALTER TABLE CONTROLLED_VOCABULARY_TERMS ADD CONSTRAINT CVTE_BK_UK UNIQUE(CODE,COVO_ID); +ALTER TABLE DATA_ALL ADD CONSTRAINT DATA_BK_UK UNIQUE(CODE); +ALTER TABLE DATABASE_INSTANCES ADD CONSTRAINT DBIN_BK_UK UNIQUE(CODE); +ALTER TABLE DATABASE_INSTANCES ADD CONSTRAINT DBIN_UUID_UK UNIQUE(UUID); +ALTER TABLE DATA_SET_RELATIONSHIPS_ALL ADD CONSTRAINT DSRE_BK_UK UNIQUE(DATA_ID_CHILD,DATA_ID_PARENT); +ALTER TABLE DATA_STORE_SERVICES ADD CONSTRAINT DSSE_BK_UK UNIQUE(KEY, DATA_STORE_ID); +ALTER TABLE DATA_STORE_SERVICE_DATA_SET_TYPES ADD CONSTRAINT DSSDST_BK_UK UNIQUE(DATA_STORE_SERVICE_ID, DATA_SET_TYPE_ID); +ALTER TABLE DATA_STORES ADD CONSTRAINT DAST_BK_UK UNIQUE(CODE,DBIN_ID); +ALTER TABLE DATA_TYPES ADD CONSTRAINT DATY_BK_UK UNIQUE(CODE); +ALTER TABLE EXPERIMENTS_ALL ADD CONSTRAINT EXPE_BK_UK UNIQUE(CODE,PROJ_ID); +ALTER TABLE EXPERIMENTS_ALL ADD CONSTRAINT EXPE_PI_UK UNIQUE(PERM_ID); +ALTER TABLE EXPERIMENT_PROPERTIES ADD CONSTRAINT EXPR_BK_UK UNIQUE(EXPE_ID,ETPT_ID); +ALTER TABLE EXPERIMENT_TYPES ADD CONSTRAINT EXTY_BK_UK UNIQUE(CODE,DBIN_ID); +ALTER TABLE EXPERIMENT_TYPE_PROPERTY_TYPES ADD CONSTRAINT ETPT_BK_UK UNIQUE(EXTY_ID,PRTY_ID); +ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_BK_UK UNIQUE(LOCATION,LOTY_ID); +ALTER TABLE FILE_FORMAT_TYPES ADD CONSTRAINT FFTY_BK_UK UNIQUE(CODE,DBIN_ID); +ALTER TABLE SPACES ADD CONSTRAINT SPACE_BK_UK UNIQUE(CODE,DBIN_ID); +ALTER TABLE LOCATOR_TYPES ADD CONSTRAINT LOTY_BK_UK UNIQUE(CODE); +ALTER TABLE MATERIALS ADD CONSTRAINT MATE_BK_UK UNIQUE(CODE,MATY_ID,DBIN_ID); +ALTER TABLE MATERIAL_PROPERTIES ADD CONSTRAINT MAPR_BK_UK UNIQUE(MATE_ID,MTPT_ID); +ALTER TABLE MATERIAL_TYPES ADD CONSTRAINT MATY_BK_UK UNIQUE(CODE,DBIN_ID); +ALTER TABLE MATERIAL_TYPE_PROPERTY_TYPES ADD CONSTRAINT MTPT_BK_UK UNIQUE(MATY_ID,PRTY_ID); +ALTER TABLE DATA_SET_TYPES ADD CONSTRAINT DSTY_BK_UK UNIQUE(CODE,DBIN_ID); +ALTER TABLE PERSONS ADD CONSTRAINT PERS_BK_UK UNIQUE(DBIN_ID,USER_ID); +ALTER TABLE PROJECTS ADD CONSTRAINT PROJ_BK_UK UNIQUE(CODE,SPACE_ID); +ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_BK_UK UNIQUE(CODE,IS_INTERNAL_NAMESPACE,DBIN_ID); +ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_PE_SPACE_BK_UK UNIQUE(PERS_ID_GRANTEE,ROLE_CODE,SPACE_ID); +ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_PE_INSTANCE_BK_UK UNIQUE(PERS_ID_GRANTEE,ROLE_CODE,DBIN_ID); +ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_AG_SPACE_BK_UK UNIQUE(AG_ID_GRANTEE,ROLE_CODE,SPACE_ID); +ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_AG_INSTANCE_BK_UK UNIQUE(AG_ID_GRANTEE,ROLE_CODE,DBIN_ID); +ALTER TABLE SAMPLES_ALL ADD CONSTRAINT SAMP_PI_UK UNIQUE(PERM_ID); +ALTER TABLE SAMPLE_PROPERTIES ADD CONSTRAINT SAPR_BK_UK UNIQUE(SAMP_ID,STPT_ID); +ALTER TABLE SAMPLE_TYPES ADD CONSTRAINT SATY_BK_UK UNIQUE(CODE,DBIN_ID); +ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ADD CONSTRAINT STPT_BK_UK UNIQUE(SATY_ID,PRTY_ID); +ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT DSTPT_BK_UK UNIQUE(DSTY_ID,PRTY_ID); +ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_BK_UK UNIQUE(DS_ID,DSTPT_ID); +-- NOTE: following uniqueness constraints for attachments work, because (null != null) in Postgres +ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_EXPE_BK_UK UNIQUE(EXPE_ID,FILE_NAME,VERSION); +ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_PROJ_BK_UK UNIQUE(PROJ_ID,FILE_NAME,VERSION); +ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_SAMP_BK_UK UNIQUE(SAMP_ID,FILE_NAME,VERSION); +ALTER TABLE AUTHORIZATION_GROUPS ADD CONSTRAINT AG_BK_UK UNIQUE(CODE,DBIN_ID); +ALTER TABLE FILTERS ADD CONSTRAINT FILT_BK_UK UNIQUE(NAME, DBIN_ID, GRID_ID); +ALTER TABLE GRID_CUSTOM_COLUMNS ADD CONSTRAINT GRID_CUSTOM_COLUMNS_BK_UK UNIQUE(CODE, DBIN_ID, GRID_ID); +ALTER TABLE QUERIES ADD CONSTRAINT QUER_BK_UK UNIQUE(NAME, DBIN_ID); +ALTER TABLE sample_relationships_all ADD CONSTRAINT sare_bk_uk UNIQUE(sample_id_child,sample_id_parent,relationship_id); +ALTER TABLE relationship_types ADD CONSTRAINT rety_uk UNIQUE(code,dbin_id); +ALTER TABLE SCRIPTS ADD CONSTRAINT SCRI_UK UNIQUE(NAME,DBIN_ID); +ALTER TABLE CORE_PLUGINS ADD CONSTRAINT COPL_NAME_VER_UK UNIQUE(NAME,VERSION); + + +-- Creating foreign key constraints + +ALTER TABLE CONTROLLED_VOCABULARIES ADD CONSTRAINT COVO_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID); +ALTER TABLE CONTROLLED_VOCABULARIES ADD CONSTRAINT COVO_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE CONTROLLED_VOCABULARY_TERMS ADD CONSTRAINT CVTE_COVO_FK FOREIGN KEY (COVO_ID) REFERENCES CONTROLLED_VOCABULARIES(ID); +ALTER TABLE CONTROLLED_VOCABULARY_TERMS ADD CONSTRAINT CVTE_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE DATA_ALL ADD CONSTRAINT DATA_DSTY_FK FOREIGN KEY (DSTY_ID) REFERENCES DATA_SET_TYPES(ID); +ALTER TABLE DATA_ALL ADD CONSTRAINT DATA_EXPE_FK FOREIGN KEY (EXPE_ID) REFERENCES EXPERIMENTS_ALL(ID); +ALTER TABLE DATA_ALL ADD CONSTRAINT DATA_SAMP_FK FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES_ALL(ID); +ALTER TABLE DATA_ALL ADD CONSTRAINT DATA_DAST_FK FOREIGN KEY (DAST_ID) REFERENCES DATA_STORES(ID); +ALTER TABLE DATA_ALL ADD CONSTRAINT DATA_CTNR_FK FOREIGN KEY (CTNR_ID) REFERENCES DATA_ALL(ID); +ALTER TABLE DATA_ALL ADD CONSTRAINT DATA_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE DATA_ALL ADD CONSTRAINT DATA_DEL_FK FOREIGN KEY (DEL_ID) REFERENCES DELETIONS(ID); +ALTER TABLE DATA_SET_RELATIONSHIPS_ALL ADD CONSTRAINT DSRE_DATA_FK_CHILD FOREIGN KEY (DATA_ID_CHILD) REFERENCES DATA_ALL(ID); +ALTER TABLE DATA_SET_RELATIONSHIPS_ALL ADD CONSTRAINT DSRE_DATA_FK_PARENT FOREIGN KEY (DATA_ID_PARENT) REFERENCES DATA_ALL(ID); +ALTER TABLE sample_relationships_all ADD CONSTRAINT sare_data_fk_child FOREIGN KEY (sample_id_child) REFERENCES SAMPLES_ALL(id) ON DELETE CASCADE; +ALTER TABLE sample_relationships_all ADD CONSTRAINT sare_data_fk_parent FOREIGN KEY (sample_id_parent) REFERENCES SAMPLES_ALL(id) ON DELETE CASCADE; +ALTER TABLE sample_relationships_all ADD CONSTRAINT sare_data_fk_relationship FOREIGN KEY (relationship_id) REFERENCES relationship_types(id); +ALTER TABLE DATA_STORES ADD CONSTRAINT DAST_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID); +ALTER TABLE DATA_STORE_SERVICES ADD CONSTRAINT DSSE_DS_FK FOREIGN KEY (DATA_STORE_ID) REFERENCES DATA_STORES(ID) ON DELETE CASCADE; +ALTER TABLE DATA_STORE_SERVICE_DATA_SET_TYPES ADD CONSTRAINT DSSDST_DS_FK FOREIGN KEY (DATA_STORE_SERVICE_ID) REFERENCES DATA_STORE_SERVICES(ID) ON DELETE CASCADE; +ALTER TABLE DATA_STORE_SERVICE_DATA_SET_TYPES ADD CONSTRAINT DSSDST_DST_FK FOREIGN KEY (DATA_SET_TYPE_ID) REFERENCES DATA_SET_TYPES(ID) ON DELETE CASCADE; +ALTER TABLE EVENTS ADD CONSTRAINT EVNT_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE EXPERIMENTS_ALL ADD CONSTRAINT EXPE_EXTY_FK FOREIGN KEY (EXTY_ID) REFERENCES EXPERIMENT_TYPES(ID); +ALTER TABLE EXPERIMENTS_ALL ADD CONSTRAINT EXPE_DEL_FK FOREIGN KEY (DEL_ID) REFERENCES DELETIONS(ID); +ALTER TABLE EXPERIMENTS_ALL ADD CONSTRAINT EXPE_MATE_FK FOREIGN KEY (MATE_ID_STUDY_OBJECT) REFERENCES MATERIALS(ID); +ALTER TABLE EXPERIMENTS_ALL ADD CONSTRAINT EXPE_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE EXPERIMENTS_ALL ADD CONSTRAINT EXPE_PROJ_FK FOREIGN KEY (PROJ_ID) REFERENCES PROJECTS(ID); +ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_EXPE_FK FOREIGN KEY (EXPE_ID) REFERENCES EXPERIMENTS_ALL(ID); +ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_PROJ_FK FOREIGN KEY (PROJ_ID) REFERENCES PROJECTS(ID); +ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_SAMP_FK FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES_ALL(ID); +ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE ATTACHMENTS ADD CONSTRAINT ATTA_CONT_FK FOREIGN KEY (EXAC_ID) REFERENCES ATTACHMENT_CONTENTS(ID); +ALTER TABLE EXPERIMENT_PROPERTIES ADD CONSTRAINT EXPR_CVTE_FK FOREIGN KEY (CVTE_ID) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID); +ALTER TABLE EXPERIMENT_PROPERTIES ADD CONSTRAINT EXPR_ETPT_FK FOREIGN KEY (ETPT_ID) REFERENCES EXPERIMENT_TYPE_PROPERTY_TYPES(ID) ON DELETE CASCADE; +ALTER TABLE EXPERIMENT_PROPERTIES ADD CONSTRAINT EXPR_EXPE_FK FOREIGN KEY (EXPE_ID) REFERENCES EXPERIMENTS_ALL(ID); +ALTER TABLE EXPERIMENT_PROPERTIES ADD CONSTRAINT EXPR_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE EXPERIMENT_PROPERTIES ADD CONSTRAINT EXPR_MAPR_FK FOREIGN KEY (MATE_PROP_ID) REFERENCES MATERIALS(ID); +ALTER TABLE EXPERIMENT_PROPERTIES_HISTORY ADD CONSTRAINT EXPRH_CVTE_FK FOREIGN KEY (CVTE_ID) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID); +ALTER TABLE EXPERIMENT_PROPERTIES_HISTORY ADD CONSTRAINT EXPRH_ETPT_FK FOREIGN KEY (ETPT_ID) REFERENCES EXPERIMENT_TYPE_PROPERTY_TYPES(ID) ON DELETE CASCADE; +ALTER TABLE EXPERIMENT_PROPERTIES_HISTORY ADD CONSTRAINT EXPRH_EXPE_FK FOREIGN KEY (EXPE_ID) REFERENCES EXPERIMENTS_ALL(ID) ON DELETE CASCADE; +ALTER TABLE EXPERIMENT_PROPERTIES_HISTORY ADD CONSTRAINT EXPRH_MAPR_FK FOREIGN KEY (MATE_PROP_ID) REFERENCES MATERIALS(ID); +ALTER TABLE EXPERIMENT_TYPES ADD CONSTRAINT EXTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID); +ALTER TABLE EXPERIMENT_TYPE_PROPERTY_TYPES ADD CONSTRAINT ETPT_EXTY_FK FOREIGN KEY (EXTY_ID) REFERENCES EXPERIMENT_TYPES(ID) ON DELETE CASCADE; +ALTER TABLE EXPERIMENT_TYPE_PROPERTY_TYPES ADD CONSTRAINT ETPT_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE EXPERIMENT_TYPE_PROPERTY_TYPES ADD CONSTRAINT ETPT_PRTY_FK FOREIGN KEY (PRTY_ID) REFERENCES PROPERTY_TYPES(ID) ON DELETE CASCADE; +ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_CVTE_FK FOREIGN KEY (CVTE_ID_STOR_FMT) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID); +ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_CVTE_STORED_ON_FK FOREIGN KEY (CVTE_ID_STORE) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID); +ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_DATA_FK FOREIGN KEY (DATA_ID) REFERENCES DATA_ALL(ID); +ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_FFTY_FK FOREIGN KEY (FFTY_ID) REFERENCES FILE_FORMAT_TYPES(ID); +ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_LOTY_FK FOREIGN KEY (LOTY_ID) REFERENCES LOCATOR_TYPES(ID); +ALTER TABLE FILE_FORMAT_TYPES ADD CONSTRAINT FFTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID); +ALTER TABLE SPACES ADD CONSTRAINT SPACE_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID); +ALTER TABLE SPACES ADD CONSTRAINT SPACE_PERS_FK_REGISTERER FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE DELETIONS ADD CONSTRAINT DEL_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE MATERIALS ADD CONSTRAINT MATE_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID); +ALTER TABLE MATERIALS ADD CONSTRAINT MATE_MATY_FK FOREIGN KEY (MATY_ID) REFERENCES MATERIAL_TYPES(ID); +ALTER TABLE MATERIALS ADD CONSTRAINT MATE_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE MATERIAL_PROPERTIES ADD CONSTRAINT MAPR_CVTE_FK FOREIGN KEY (CVTE_ID) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID); +ALTER TABLE MATERIAL_PROPERTIES ADD CONSTRAINT MAPR_MAPR_FK FOREIGN KEY (MATE_PROP_ID) REFERENCES MATERIALS(ID); +ALTER TABLE MATERIAL_PROPERTIES ADD CONSTRAINT MAPR_MATE_FK FOREIGN KEY (MATE_ID) REFERENCES MATERIALS(ID); +ALTER TABLE MATERIAL_PROPERTIES ADD CONSTRAINT MAPR_MTPT_FK FOREIGN KEY (MTPT_ID) REFERENCES MATERIAL_TYPE_PROPERTY_TYPES(ID) ON DELETE CASCADE; +ALTER TABLE MATERIAL_PROPERTIES ADD CONSTRAINT MAPR_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE MATERIAL_PROPERTIES_HISTORY ADD CONSTRAINT MAPRH_CVTE_FK FOREIGN KEY (CVTE_ID) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID); +ALTER TABLE MATERIAL_PROPERTIES_HISTORY ADD CONSTRAINT MAPRH_MAPR_FK FOREIGN KEY (MATE_PROP_ID) REFERENCES MATERIALS(ID); +ALTER TABLE MATERIAL_PROPERTIES_HISTORY ADD CONSTRAINT MAPRH_MATE_FK FOREIGN KEY (MATE_ID) REFERENCES MATERIALS(ID) ON DELETE CASCADE; +ALTER TABLE MATERIAL_PROPERTIES_HISTORY ADD CONSTRAINT MAPRH_MTPT_FK FOREIGN KEY (MTPT_ID) REFERENCES MATERIAL_TYPE_PROPERTY_TYPES(ID) ON DELETE CASCADE; +ALTER TABLE MATERIAL_TYPES ADD CONSTRAINT MATY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID); +ALTER TABLE MATERIAL_TYPE_PROPERTY_TYPES ADD CONSTRAINT MTPT_MATY_FK FOREIGN KEY (MATY_ID) REFERENCES MATERIAL_TYPES(ID) ON DELETE CASCADE; +ALTER TABLE MATERIAL_TYPE_PROPERTY_TYPES ADD CONSTRAINT MTPT_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE MATERIAL_TYPE_PROPERTY_TYPES ADD CONSTRAINT MTPT_PRTY_FK FOREIGN KEY (PRTY_ID) REFERENCES PROPERTY_TYPES(ID) ON DELETE CASCADE; +ALTER TABLE DATA_SET_TYPES ADD CONSTRAINT DSTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID); +ALTER TABLE PERSONS ADD CONSTRAINT PERS_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID); +ALTER TABLE PERSONS ADD CONSTRAINT PERS_SPACE_FK FOREIGN KEY (SPACE_ID) REFERENCES SPACES(ID); +ALTER TABLE PERSONS ADD CONSTRAINT PERS_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE PROJECTS ADD CONSTRAINT PROJ_SPACE_FK FOREIGN KEY (SPACE_ID) REFERENCES SPACES(ID); +ALTER TABLE PROJECTS ADD CONSTRAINT PROJ_PERS_FK_LEADER FOREIGN KEY (PERS_ID_LEADER) REFERENCES PERSONS(ID); +ALTER TABLE PROJECTS ADD CONSTRAINT PROJ_PERS_FK_REGISTERER FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_COVO_FK FOREIGN KEY (COVO_ID) REFERENCES CONTROLLED_VOCABULARIES(ID); +ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_DATY_FK FOREIGN KEY (DATY_ID) REFERENCES DATA_TYPES(ID); +ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID); +ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE PROPERTY_TYPES ADD CONSTRAINT PRTY_MATY_FK FOREIGN KEY (MATY_PROP_ID) REFERENCES MATERIAL_TYPES(ID) ON DELETE CASCADE; +ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID); +ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_SPACE_FK FOREIGN KEY (SPACE_ID) REFERENCES SPACES(ID); +ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_PERS_FK_GRANTEE FOREIGN KEY (PERS_ID_GRANTEE) REFERENCES PERSONS(ID); +ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_AG_FK_GRANTEE FOREIGN KEY (AG_ID_GRANTEE) REFERENCES AUTHORIZATION_GROUPS(ID); +ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_PERS_FK_REGISTERER FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE SAMPLES_ALL ADD CONSTRAINT SAMP_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID); +ALTER TABLE SAMPLES_ALL ADD CONSTRAINT SAMP_SPACE_FK FOREIGN KEY (SPACE_ID) REFERENCES SPACES(ID); +ALTER TABLE SAMPLES_ALL ADD CONSTRAINT SAMP_DEL_FK FOREIGN KEY (DEL_ID) REFERENCES DELETIONS(ID); +ALTER TABLE SAMPLES_ALL ADD CONSTRAINT SAMP_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE SAMPLES_ALL ADD CONSTRAINT SAMP_SAMP_FK_PART_OF FOREIGN KEY (SAMP_ID_PART_OF) REFERENCES SAMPLES_ALL(ID); +ALTER TABLE SAMPLES_ALL ADD CONSTRAINT SAMP_EXPE_FK FOREIGN KEY (EXPE_ID) REFERENCES EXPERIMENTS_ALL(ID); +ALTER TABLE SAMPLES_ALL ADD CONSTRAINT SAMP_SATY_FK FOREIGN KEY (SATY_ID) REFERENCES SAMPLE_TYPES(ID); +ALTER TABLE SAMPLE_PROPERTIES ADD CONSTRAINT SAPR_CVTE_FK FOREIGN KEY (CVTE_ID) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID); +ALTER TABLE SAMPLE_PROPERTIES ADD CONSTRAINT SAPR_MAPR_FK FOREIGN KEY (MATE_PROP_ID) REFERENCES MATERIALS(ID); +ALTER TABLE SAMPLE_PROPERTIES ADD CONSTRAINT SAPR_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE SAMPLE_PROPERTIES ADD CONSTRAINT SAPR_SAMP_FK FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES_ALL(ID); +ALTER TABLE SAMPLE_PROPERTIES ADD CONSTRAINT SAPR_STPT_FK FOREIGN KEY (STPT_ID) REFERENCES SAMPLE_TYPE_PROPERTY_TYPES(ID) ON DELETE CASCADE; +ALTER TABLE SAMPLE_PROPERTIES_HISTORY ADD CONSTRAINT SAPRH_CVTE_FK FOREIGN KEY (CVTE_ID) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID); +ALTER TABLE SAMPLE_PROPERTIES_HISTORY ADD CONSTRAINT SAPRH_MAPR_FK FOREIGN KEY (MATE_PROP_ID) REFERENCES MATERIALS(ID); +ALTER TABLE SAMPLE_PROPERTIES_HISTORY ADD CONSTRAINT SAPRH_SAMP_FK FOREIGN KEY (SAMP_ID) REFERENCES SAMPLES_ALL(ID) ON DELETE CASCADE; +ALTER TABLE SAMPLE_PROPERTIES_HISTORY ADD CONSTRAINT SAPRH_STPT_FK FOREIGN KEY (STPT_ID) REFERENCES SAMPLE_TYPE_PROPERTY_TYPES(ID) ON DELETE CASCADE; +ALTER TABLE SAMPLE_TYPES ADD CONSTRAINT SATY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID); +ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ADD CONSTRAINT STPT_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ADD CONSTRAINT STPT_PRTY_FK FOREIGN KEY (PRTY_ID) REFERENCES PROPERTY_TYPES(ID) ON DELETE CASCADE; +ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ADD CONSTRAINT STPT_SATY_FK FOREIGN KEY (SATY_ID) REFERENCES SAMPLE_TYPES(ID) ON DELETE CASCADE; +ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT DSTPT_DSTY_FK FOREIGN KEY (DSTY_ID) REFERENCES DATA_SET_TYPES(ID) ON DELETE CASCADE; +ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT DSTPT_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT DSTPT_PRTY_FK FOREIGN KEY (PRTY_ID) REFERENCES PROPERTY_TYPES(ID) ON DELETE CASCADE; +ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_CVTE_FK FOREIGN KEY (CVTE_ID) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID); +ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_DSTPT_FK FOREIGN KEY (DSTPT_ID) REFERENCES DATA_SET_TYPE_PROPERTY_TYPES(ID) ON DELETE CASCADE; +ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_DS_FK FOREIGN KEY (DS_ID) REFERENCES DATA_ALL(ID); +ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_MAPR_FK FOREIGN KEY (MATE_PROP_ID) REFERENCES MATERIALS(ID); +ALTER TABLE DATA_SET_PROPERTIES_HISTORY ADD CONSTRAINT DSPRH_CVTE_FK FOREIGN KEY (CVTE_ID) REFERENCES CONTROLLED_VOCABULARY_TERMS(ID); +ALTER TABLE DATA_SET_PROPERTIES_HISTORY ADD CONSTRAINT DSPRH_DSTPT_FK FOREIGN KEY (DSTPT_ID) REFERENCES DATA_SET_TYPE_PROPERTY_TYPES(ID) ON DELETE CASCADE; +ALTER TABLE DATA_SET_PROPERTIES_HISTORY ADD CONSTRAINT DSPRH_DS_FK FOREIGN KEY (DS_ID) REFERENCES DATA_ALL(ID) ON DELETE CASCADE; +ALTER TABLE DATA_SET_PROPERTIES_HISTORY ADD CONSTRAINT DSPRH_MAPR_FK FOREIGN KEY (MATE_PROP_ID) REFERENCES MATERIALS(ID); +ALTER TABLE AUTHORIZATION_GROUPS ADD CONSTRAINT AG_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID); +ALTER TABLE AUTHORIZATION_GROUP_PERSONS ADD CONSTRAINT AGP_AG_FK FOREIGN KEY (AG_ID) REFERENCES AUTHORIZATION_GROUPS(ID); +ALTER TABLE AUTHORIZATION_GROUP_PERSONS ADD CONSTRAINT AGP_PERS_FK FOREIGN KEY (PERS_ID) REFERENCES PERSONS(ID); +ALTER TABLE AUTHORIZATION_GROUPS ADD CONSTRAINT AG_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); + +ALTER TABLE FILTERS ADD CONSTRAINT FILT_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE FILTERS ADD CONSTRAINT FILT_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID); +ALTER TABLE GRID_CUSTOM_COLUMNS ADD CONSTRAINT GRID_CUSTOM_COLUMNS_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE GRID_CUSTOM_COLUMNS ADD CONSTRAINT GRID_CUSTOM_COLUMNS_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID); +ALTER TABLE QUERIES ADD CONSTRAINT QUER_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE QUERIES ADD CONSTRAINT QUER_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID); + +ALTER TABLE SCRIPTS ADD CONSTRAINT SCRI_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID); +ALTER TABLE SCRIPTS ADD CONSTRAINT SCRI_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID); +ALTER TABLE MATERIAL_TYPE_PROPERTY_TYPES ADD CONSTRAINT MTPT_SCRIPT_FK FOREIGN KEY (SCRIPT_ID) REFERENCES SCRIPTS(ID); +ALTER TABLE SAMPLE_TYPE_PROPERTY_TYPES ADD CONSTRAINT STPT_SCRIPT_FK FOREIGN KEY (SCRIPT_ID) REFERENCES SCRIPTS(ID); +ALTER TABLE EXPERIMENT_TYPE_PROPERTY_TYPES ADD CONSTRAINT ETPT_SCRIPT_FK FOREIGN KEY (SCRIPT_ID) REFERENCES SCRIPTS(ID); +ALTER TABLE DATA_SET_TYPE_PROPERTY_TYPES ADD CONSTRAINT DSTPT_SCRIPT_FK FOREIGN KEY (SCRIPT_ID) REFERENCES SCRIPTS(ID); + +-- Creating check constraints + +ALTER TABLE EXPERIMENT_PROPERTIES ADD CONSTRAINT EXPR_CK CHECK + ((VALUE IS NOT NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NULL) OR + (VALUE IS NULL AND CVTE_ID IS NOT NULL AND MATE_PROP_ID IS NULL) OR + (VALUE IS NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NOT NULL) + ); +ALTER TABLE EXPERIMENT_PROPERTIES_HISTORY ADD CONSTRAINT EXPRH_CK CHECK + ((VALUE IS NOT NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NULL) OR + (VALUE IS NULL AND CVTE_ID IS NOT NULL AND MATE_PROP_ID IS NULL) OR + (VALUE IS NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NOT NULL) + ); +ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_DBIN_SPACE_ARC_CK CHECK ((DBIN_ID IS NOT NULL AND SPACE_ID IS NULL) OR (DBIN_ID IS NULL AND SPACE_ID IS NOT NULL)); +ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_AG_PERS_ARC_CK CHECK ((AG_ID_GRANTEE IS NOT NULL AND PERS_ID_GRANTEE IS NULL) OR (AG_ID_GRANTEE IS NULL AND PERS_ID_GRANTEE IS NOT NULL)); + +ALTER TABLE SAMPLES_ALL ADD CONSTRAINT SAMP_DBIN_SPACE_ARC_CK CHECK ((DBIN_ID IS NOT NULL AND SPACE_ID IS NULL) OR (DBIN_ID IS NULL AND SPACE_ID IS NOT NULL)); +ALTER TABLE SAMPLE_PROPERTIES ADD CONSTRAINT SAPR_CK CHECK + ((VALUE IS NOT NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NULL) OR + (VALUE IS NULL AND CVTE_ID IS NOT NULL AND MATE_PROP_ID IS NULL) OR + (VALUE IS NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NOT NULL) + ); +ALTER TABLE SAMPLE_PROPERTIES_HISTORY ADD CONSTRAINT SAPRH_CK CHECK + ((VALUE IS NOT NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NULL) OR + (VALUE IS NULL AND CVTE_ID IS NOT NULL AND MATE_PROP_ID IS NULL) OR + (VALUE IS NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NOT NULL) + ); +ALTER TABLE MATERIAL_PROPERTIES ADD CONSTRAINT MAPR_CK CHECK + ((VALUE IS NOT NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NULL) OR + (VALUE IS NULL AND CVTE_ID IS NOT NULL AND MATE_PROP_ID IS NULL) OR + (VALUE IS NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NOT NULL) + ); +ALTER TABLE MATERIAL_PROPERTIES_HISTORY ADD CONSTRAINT MAPRH_CK CHECK + ((VALUE IS NOT NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NULL) OR + (VALUE IS NULL AND CVTE_ID IS NOT NULL AND MATE_PROP_ID IS NULL) OR + (VALUE IS NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NOT NULL) + ); +ALTER TABLE DATA_SET_PROPERTIES ADD CONSTRAINT DSPR_CK CHECK + ((VALUE IS NOT NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NULL) OR + (VALUE IS NULL AND CVTE_ID IS NOT NULL AND MATE_PROP_ID IS NULL) OR + (VALUE IS NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NOT NULL) + ); +ALTER TABLE DATA_SET_PROPERTIES_HISTORY ADD CONSTRAINT DSPRH_CK CHECK + ((VALUE IS NOT NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NULL) OR + (VALUE IS NULL AND CVTE_ID IS NOT NULL AND MATE_PROP_ID IS NULL) OR + (VALUE IS NULL AND CVTE_ID IS NULL AND MATE_PROP_ID IS NOT NULL) + ); +ALTER TABLE ATTACHMENTS ADD 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) + ); +ALTER TABLE events ADD CONSTRAINT evnt_et_enum_ck CHECK + (entity_type IN ('ATTACHMENT', 'DATASET', 'EXPERIMENT', 'SPACE', 'MATERIAL', 'PROJECT', 'PROPERTY_TYPE', 'SAMPLE', 'VOCABULARY', 'AUTHORIZATION_GROUP')); +ALTER TABLE controlled_vocabulary_terms ADD CONSTRAINT cvte_ck CHECK (ordinal > 0); + +-- Creating indices + +CREATE INDEX COVO_PERS_FK_I ON CONTROLLED_VOCABULARIES (PERS_ID_REGISTERER); +CREATE INDEX CVTE_COVO_FK_I ON CONTROLLED_VOCABULARY_TERMS (COVO_ID); +CREATE INDEX CVTE_PERS_FK_I ON CONTROLLED_VOCABULARY_TERMS (PERS_ID_REGISTERER); +CREATE INDEX DATA_DSTY_FK_I ON DATA_ALL (DSTY_ID); +CREATE INDEX DATA_SAMP_FK_I ON DATA_ALL (SAMP_ID); +CREATE INDEX DATA_EXPE_FK_I ON DATA_ALL (EXPE_ID); +CREATE INDEX DATA_DEL_FK_I ON DATA_ALL (DEL_ID); +CREATE INDEX DAST_DBIN_FK_I ON DATA_STORES (DBIN_ID); +CREATE INDEX DSRE_DATA_FK_I_CHILD ON DATA_SET_RELATIONSHIPS_ALL (DATA_ID_CHILD); +CREATE INDEX DSRE_DATA_FK_I_PARENT ON DATA_SET_RELATIONSHIPS_ALL (DATA_ID_PARENT); +CREATE INDEX sare_data_fk_i_child ON sample_relationships_all (sample_id_child); +CREATE INDEX sare_data_fk_i_parent ON sample_relationships_all (sample_id_parent); +CREATE INDEX sare_data_fk_i_relationship ON sample_relationships_all (relationship_id); +CREATE INDEX DSSE_DS_FK_I ON DATA_STORE_SERVICES (DATA_STORE_ID); +CREATE INDEX DSSDST_DS_FK_I ON DATA_STORE_SERVICE_DATA_SET_TYPES (DATA_STORE_SERVICE_ID); +CREATE INDEX DSSDST_DST_FK_I ON DATA_STORE_SERVICE_DATA_SET_TYPES (DATA_SET_TYPE_ID); +CREATE INDEX ETPT_EXTY_FK_I ON EXPERIMENT_TYPE_PROPERTY_TYPES (EXTY_ID); +CREATE INDEX ETPT_PERS_FK_I ON EXPERIMENT_TYPE_PROPERTY_TYPES (PERS_ID_REGISTERER); +CREATE INDEX ETPT_PRTY_FK_I ON EXPERIMENT_TYPE_PROPERTY_TYPES (PRTY_ID); +CREATE INDEX EVNT_PERS_FK_I ON EVENTS (PERS_ID_REGISTERER); +CREATE INDEX ATTA_EXPE_FK_I ON ATTACHMENTS (EXPE_ID); +CREATE INDEX ATTA_SAMP_FK_I ON ATTACHMENTS (SAMP_ID); +CREATE INDEX ATTA_PROJ_FK_I ON ATTACHMENTS (PROJ_ID); +CREATE INDEX ATTA_PERS_FK_I ON ATTACHMENTS (PERS_ID_REGISTERER); +CREATE INDEX ATTA_EXAC_FK_I ON ATTACHMENTS (EXAC_ID); +CREATE INDEX EXDA_CVTE_FK_I ON EXTERNAL_DATA (CVTE_ID_STOR_FMT); +CREATE INDEX EXDA_CVTE_STORED_ON_FK_I ON EXTERNAL_DATA (CVTE_ID_STORE); +CREATE INDEX EXDA_FFTY_FK_I ON EXTERNAL_DATA (FFTY_ID); +CREATE INDEX EXDA_LOTY_FK_I ON EXTERNAL_DATA (LOTY_ID); +CREATE INDEX EXPE_EXTY_FK_I ON EXPERIMENTS_ALL (EXTY_ID); +CREATE INDEX EXPE_DEL_FK_I ON EXPERIMENTS_ALL (DEL_ID); +CREATE INDEX EXPE_MATE_FK_I ON EXPERIMENTS_ALL (MATE_ID_STUDY_OBJECT); +CREATE INDEX EXPE_PERS_FK_I ON EXPERIMENTS_ALL (PERS_ID_REGISTERER); +CREATE INDEX EXPE_PROJ_FK_I ON EXPERIMENTS_ALL (PROJ_ID); +CREATE INDEX EXPR_CVTE_FK_I ON EXPERIMENT_PROPERTIES (CVTE_ID); +CREATE INDEX EXPR_ETPT_FK_I ON EXPERIMENT_PROPERTIES (ETPT_ID); +CREATE INDEX EXPR_EXPE_FK_I ON EXPERIMENT_PROPERTIES (EXPE_ID); +CREATE INDEX EXPR_PERS_FK_I ON EXPERIMENT_PROPERTIES (PERS_ID_REGISTERER); +CREATE INDEX EXPR_MAPR_FK_I ON EXPERIMENT_PROPERTIES (MATE_PROP_ID); +CREATE INDEX EXPRH_CVTE_FK_I ON EXPERIMENT_PROPERTIES_HISTORY (CVTE_ID); +CREATE INDEX EXPRH_ETPT_FK_I ON EXPERIMENT_PROPERTIES_HISTORY (ETPT_ID); +CREATE INDEX EXPRH_EXPE_FK_I ON EXPERIMENT_PROPERTIES_HISTORY (EXPE_ID); +CREATE INDEX EXPRH_MAPR_FK_I ON EXPERIMENT_PROPERTIES_HISTORY (MATE_PROP_ID); +CREATE INDEX EXPRH_VUTS_FK_I ON EXPERIMENT_PROPERTIES_HISTORY (VALID_UNTIL_TIMESTAMP); +CREATE INDEX SPACE_DBIN_FK_I ON SPACES (DBIN_ID); +CREATE INDEX SPACE_PERS_REGISTERED_BY_FK_I ON SPACES (PERS_ID_REGISTERER); +CREATE INDEX DEL_PERS_FK_I ON DELETIONS (PERS_ID_REGISTERER); +CREATE INDEX MAPR_CVTE_FK_I ON MATERIAL_PROPERTIES (CVTE_ID); +CREATE INDEX MAPR_MATE_FK_I ON MATERIAL_PROPERTIES (MATE_ID); +CREATE INDEX MAPR_MTPT_FK_I ON MATERIAL_PROPERTIES (MTPT_ID); +CREATE INDEX MAPR_PERS_FK_I ON MATERIAL_PROPERTIES (PERS_ID_REGISTERER); +CREATE INDEX MAPR_MAPR_FK_I ON MATERIAL_PROPERTIES (MATE_PROP_ID); +CREATE INDEX MAPRH_CVTE_FK_I ON MATERIAL_PROPERTIES_HISTORY (CVTE_ID); +CREATE INDEX MAPRH_ETPT_FK_I ON MATERIAL_PROPERTIES_HISTORY (MTPT_ID); +CREATE INDEX MAPRH_EXPE_FK_I ON MATERIAL_PROPERTIES_HISTORY (MATE_ID); +CREATE INDEX MAPRH_MAPR_FK_I ON MATERIAL_PROPERTIES_HISTORY (MATE_PROP_ID); +CREATE INDEX MAPRH_VUTS_FK_I ON MATERIAL_PROPERTIES_HISTORY (VALID_UNTIL_TIMESTAMP); +CREATE INDEX MATE_MATY_FK_I ON MATERIALS (MATY_ID); +CREATE INDEX MATE_PERS_FK_I ON MATERIALS (PERS_ID_REGISTERER); +CREATE INDEX MTPT_MATY_FK_I ON MATERIAL_TYPE_PROPERTY_TYPES (MATY_ID); +CREATE INDEX MTPT_PERS_FK_I ON MATERIAL_TYPE_PROPERTY_TYPES (PERS_ID_REGISTERER); +CREATE INDEX MTPT_PRTY_FK_I ON MATERIAL_TYPE_PROPERTY_TYPES (PRTY_ID); +CREATE INDEX PERS_SPACE_FK_I ON PERSONS (SPACE_ID); +CREATE INDEX PROJ_SPACE_FK_I ON PROJECTS (SPACE_ID); +CREATE INDEX PROJ_PERS_FK_I_LEADER ON PROJECTS (PERS_ID_LEADER); +CREATE INDEX PROJ_PERS_FK_I_REGISTERER ON PROJECTS (PERS_ID_REGISTERER); +CREATE INDEX PRTY_COVO_FK_I ON PROPERTY_TYPES (COVO_ID); +CREATE INDEX PRTY_DATY_FK_I ON PROPERTY_TYPES (DATY_ID); +CREATE INDEX PRTY_PERS_FK_I ON PROPERTY_TYPES (PERS_ID_REGISTERER); +CREATE INDEX ROAS_DBIN_FK_I ON ROLE_ASSIGNMENTS (DBIN_ID); +CREATE INDEX ROAS_SPACE_FK_I ON ROLE_ASSIGNMENTS (SPACE_ID); +CREATE INDEX ROAS_PERS_FK_I_GRANTEE ON ROLE_ASSIGNMENTS (PERS_ID_GRANTEE); +CREATE INDEX ROAS_AG_FK_I_GRANTEE ON ROLE_ASSIGNMENTS (AG_ID_GRANTEE); +CREATE INDEX ROAS_PERS_FK_I_REGISTERER ON ROLE_ASSIGNMENTS (PERS_ID_REGISTERER); +CREATE INDEX SAMP_DEL_FK_I ON SAMPLES_ALL (DEL_ID); +CREATE INDEX SAMP_PERS_FK_I ON SAMPLES_ALL (PERS_ID_REGISTERER); +CREATE INDEX SAMP_SAMP_FK_I_PART_OF ON SAMPLES_ALL (SAMP_ID_PART_OF); +CREATE INDEX SAMP_EXPE_FK_I ON SAMPLES_ALL (EXPE_ID); +CREATE INDEX SAMP_CODE_I ON SAMPLES_ALL (CODE); +CREATE INDEX SAMP_SATY_FK_I ON SAMPLES_ALL (SATY_ID); +CREATE INDEX SAPR_CVTE_FK_I ON SAMPLE_PROPERTIES (CVTE_ID); +CREATE INDEX SAPR_PERS_FK_I ON SAMPLE_PROPERTIES (PERS_ID_REGISTERER); +CREATE INDEX SAPR_SAMP_FK_I ON SAMPLE_PROPERTIES (SAMP_ID); +CREATE INDEX SAPR_STPT_FK_I ON SAMPLE_PROPERTIES (STPT_ID); +CREATE INDEX SAPR_MAPR_FK_I ON SAMPLE_PROPERTIES (MATE_PROP_ID); +CREATE INDEX SAPRH_CVTE_FK_I ON SAMPLE_PROPERTIES_HISTORY (CVTE_ID); +CREATE INDEX SAPRH_ETPT_FK_I ON SAMPLE_PROPERTIES_HISTORY (STPT_ID); +CREATE INDEX SAPRH_EXPE_FK_I ON SAMPLE_PROPERTIES_HISTORY (SAMP_ID); +CREATE INDEX SAPRH_MAPR_FK_I ON SAMPLE_PROPERTIES_HISTORY (MATE_PROP_ID); +CREATE INDEX SAPRH_VUTS_FK_I ON SAMPLE_PROPERTIES_HISTORY (VALID_UNTIL_TIMESTAMP); +CREATE INDEX STPT_PERS_FK_I ON SAMPLE_TYPE_PROPERTY_TYPES (PERS_ID_REGISTERER); +CREATE INDEX STPT_PRTY_FK_I ON SAMPLE_TYPE_PROPERTY_TYPES (PRTY_ID); +CREATE INDEX STPT_SATY_FK_I ON SAMPLE_TYPE_PROPERTY_TYPES (SATY_ID); +CREATE INDEX DSPR_CVTE_FK_I ON DATA_SET_PROPERTIES (CVTE_ID); +CREATE INDEX DSPR_DSTPT_FK_I ON DATA_SET_PROPERTIES (DSTPT_ID); +CREATE INDEX DSPR_DS_FK_I ON DATA_SET_PROPERTIES (DS_ID); +CREATE INDEX DSPR_PERS_FK_I ON DATA_SET_PROPERTIES (PERS_ID_REGISTERER); +CREATE INDEX DSPR_MAPR_FK_I ON DATA_SET_PROPERTIES (MATE_PROP_ID); +CREATE INDEX DSPRH_CVTE_FK_I ON DATA_SET_PROPERTIES_HISTORY (CVTE_ID); +CREATE INDEX DSPRH_ETPT_FK_I ON DATA_SET_PROPERTIES_HISTORY (DSTPT_ID); +CREATE INDEX DSPRH_EXPE_FK_I ON DATA_SET_PROPERTIES_HISTORY (DS_ID); +CREATE INDEX DSPRH_MAPR_FK_I ON DATA_SET_PROPERTIES_HISTORY (MATE_PROP_ID); +CREATE INDEX DSPRH_VUTS_FK_I ON DATA_SET_PROPERTIES_HISTORY (VALID_UNTIL_TIMESTAMP); +CREATE INDEX DSTPT_DSTY_FK_I ON DATA_SET_TYPE_PROPERTY_TYPES (DSTY_ID); +CREATE INDEX DSTPT_PERS_FK_I ON DATA_SET_TYPE_PROPERTY_TYPES (PERS_ID_REGISTERER); +CREATE INDEX DSTPT_PRTY_FK_I ON DATA_SET_TYPE_PROPERTY_TYPES (PRTY_ID); +CREATE INDEX FILT_PERS_FK_I ON FILTERS (PERS_ID_REGISTERER); +CREATE INDEX FILT_DBIN_FK_I ON FILTERS (DBIN_ID); +CREATE INDEX GRID_CUSTOM_COLUMNS_PERS_FK_I ON GRID_CUSTOM_COLUMNS (PERS_ID_REGISTERER); +CREATE INDEX GRID_CUSTOM_COLUMNS_DBIN_FK_I ON GRID_CUSTOM_COLUMNS (DBIN_ID); +CREATE INDEX SCRIPT_PERS_FK_I ON SCRIPTS (PERS_ID_REGISTERER); +CREATE INDEX SCRIPT_DBIN_FK_I ON SCRIPTS (DBIN_ID); diff --git a/openbis/source/sql/postgresql/088/domains-088.sql b/openbis/source/sql/postgresql/088/domains-088.sql new file mode 100644 index 0000000000000000000000000000000000000000..9ac687acf86e544e0e4123643e7caee141b2b6e5 --- /dev/null +++ b/openbis/source/sql/postgresql/088/domains-088.sql @@ -0,0 +1,28 @@ +-- Creating domains + +CREATE DOMAIN AUTHORIZATION_ROLE AS VARCHAR(40) CHECK (VALUE IN ('ADMIN', 'POWER_USER', 'USER', 'OBSERVER', 'ETL_SERVER')); +CREATE DOMAIN BOOLEAN_CHAR AS BOOLEAN DEFAULT FALSE; +CREATE DOMAIN BOOLEAN_CHAR_OR_UNKNOWN AS CHAR(1) DEFAULT 'U' CHECK (VALUE IN ('F', 'T', 'U')); +CREATE DOMAIN CODE AS VARCHAR(60); +CREATE DOMAIN COLUMN_LABEL AS VARCHAR(128); +CREATE DOMAIN DATA_STORE_SERVICE_KIND AS VARCHAR(40) CHECK (VALUE IN ('PROCESSING', 'QUERIES')); +CREATE DOMAIN DATA_STORE_SERVICE_REPORTING_PLUGIN_TYPE AS VARCHAR(40) CHECK (VALUE IN ('TABLE_MODEL', 'DSS_LINK')); +CREATE DOMAIN EVENT_TYPE AS VARCHAR(40) CHECK (VALUE IN ('DELETION', 'MOVEMENT')); +CREATE DOMAIN FILE AS BYTEA; +CREATE DOMAIN FILE_NAME AS VARCHAR(100); +CREATE DOMAIN TEXT_VALUE AS TEXT; +CREATE DOMAIN OBJECT_NAME AS VARCHAR(50); +CREATE DOMAIN REAL_VALUE AS REAL; +CREATE DOMAIN TECH_ID AS BIGINT; +CREATE DOMAIN TIME_STAMP AS TIMESTAMP WITH TIME ZONE; +CREATE DOMAIN TIME_STAMP_DFL AS TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP; +CREATE DOMAIN USER_ID AS VARCHAR(50); +CREATE DOMAIN TITLE_100 AS VARCHAR(100); +CREATE DOMAIN GRID_EXPRESSION AS VARCHAR(2000); +CREATE DOMAIN GRID_ID AS VARCHAR(200); +CREATE DOMAIN ORDINAL_INT AS BIGINT CHECK (VALUE > 0); +CREATE DOMAIN DESCRIPTION_2000 AS VARCHAR(2000); +CREATE DOMAIN ARCHIVING_STATUS AS VARCHAR(100) CHECK (VALUE IN ('LOCKED', 'AVAILABLE', 'ARCHIVED', 'ARCHIVE_PENDING', 'UNARCHIVE_PENDING', 'BACKUP_PENDING')); +CREATE DOMAIN QUERY_TYPE AS VARCHAR(40) CHECK (VALUE IN ('GENERIC', 'EXPERIMENT', 'SAMPLE', 'DATA_SET', 'MATERIAL')); +CREATE DOMAIN ENTITY_KIND AS VARCHAR(40) CHECK (VALUE IN ('SAMPLE', 'EXPERIMENT', 'DATA_SET', 'MATERIAL')); +CREATE DOMAIN SCRIPT_TYPE AS VARCHAR(40) CHECK (VALUE IN ('DYNAMIC_PROPERTY', 'MANAGED_PROPERTY')); \ No newline at end of file diff --git a/openbis/source/sql/postgresql/088/function-088.sql b/openbis/source/sql/postgresql/088/function-088.sql new file mode 100644 index 0000000000000000000000000000000000000000..bc4a9ab13f6ebe6720e433daa22bfd9a584ee889 --- /dev/null +++ b/openbis/source/sql/postgresql/088/function-088.sql @@ -0,0 +1,795 @@ +-- Creating Functions + +------------------------------------------------------------------------------------ +-- Purpose: Create function RENAME_SEQUENCE() that is required for renaming the sequences belonging to tables +------------------------------------------------------------------------------------ +CREATE FUNCTION RENAME_SEQUENCE(OLD_NAME VARCHAR, NEW_NAME VARCHAR) RETURNS INTEGER AS $$ +DECLARE + CURR_SEQ_VAL INTEGER; +BEGIN + SELECT INTO CURR_SEQ_VAL NEXTVAL(OLD_NAME); + EXECUTE 'CREATE SEQUENCE ' || NEW_NAME || ' START WITH ' || CURR_SEQ_VAL; + EXECUTE 'DROP SEQUENCE ' || OLD_NAME; + RETURN CURR_SEQ_VAL; +END; +$$ LANGUAGE 'plpgsql'; + + +------------------------------------------------------------------------------------ +-- Purpose: Create trigger CONTROLLED_VOCABULARY_CHECK +------------------------------------------------------------------------------------ + +CREATE OR REPLACE FUNCTION CONTROLLED_VOCABULARY_CHECK() RETURNS trigger AS $$ +DECLARE + v_code CODE; +BEGIN + + select code into v_code from data_types where id = NEW.daty_id; + + -- Check if the data is of type "CONTROLLEDVOCABULARY" + if v_code = 'CONTROLLEDVOCABULARY' then + if NEW.covo_id IS NULL then + RAISE EXCEPTION 'Insert/Update of Property Type (Code: %) failed, as its Data Type is CONTROLLEDVOCABULARY, but it is not linked to a Controlled Vocabulary.', NEW.code; + end if; + end if; + + RETURN NEW; + +END; +$$ LANGUAGE 'plpgsql'; + +CREATE TRIGGER CONTROLLED_VOCABULARY_CHECK BEFORE INSERT OR UPDATE ON PROPERTY_TYPES + FOR EACH ROW EXECUTE PROCEDURE CONTROLLED_VOCABULARY_CHECK(); + + +------------------------------------------------------------------------------------ +-- Purpose: Create trigger EXTERNAL_DATA_STORAGE_FORMAT_CHECK +------------------------------------------------------------------------------------ + +CREATE OR REPLACE FUNCTION EXTERNAL_DATA_STORAGE_FORMAT_CHECK() RETURNS trigger AS $$ +DECLARE + v_covo_code CODE; + data_code CODE; +BEGIN + + select code into v_covo_code from controlled_vocabularies + where is_internal_namespace = true and + id = (select covo_id from controlled_vocabulary_terms where id = NEW.cvte_id_stor_fmt); + -- Check if the data storage format is a term of the controlled vocabulary "STORAGE_FORMAT" + if v_covo_code != 'STORAGE_FORMAT' then + select code into data_code from data_all where id = NEW.data_id; + 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; + end if; + + RETURN NEW; + +END; +$$ LANGUAGE 'plpgsql'; + +CREATE TRIGGER EXTERNAL_DATA_STORAGE_FORMAT_CHECK BEFORE INSERT OR UPDATE ON EXTERNAL_DATA + FOR EACH ROW EXECUTE PROCEDURE EXTERNAL_DATA_STORAGE_FORMAT_CHECK(); + + +------------------------------------------------------------------------------------ +-- Purpose: Create triggers for checking sample code uniqueness +------------------------------------------------------------------------------------ + +CREATE OR REPLACE FUNCTION SAMPLE_CODE_UNIQUENESS_CHECK() RETURNS trigger AS $$ +DECLARE + counter INTEGER; +BEGIN + LOCK TABLE samples_all IN EXCLUSIVE MODE; + + IF (NEW.samp_id_part_of is NULL) THEN + IF (NEW.dbin_id is not NULL) THEN + SELECT count(*) into counter FROM samples_all + where id != NEW.id and code = NEW.code and samp_id_part_of is NULL and dbin_id = NEW.dbin_id; + IF (counter > 0) THEN + RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample with the same code already exists.', NEW.code; + END IF; + ELSIF (NEW.space_id is not NULL) THEN + SELECT count(*) into counter FROM samples_all + where id != NEW.id and code = NEW.code and samp_id_part_of is NULL and space_id = NEW.space_id; + IF (counter > 0) THEN + RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because space sample with the same code already exists.', NEW.code; + END IF; + END IF; + ELSE + IF (NEW.dbin_id is not NULL) THEN + SELECT count(*) into counter FROM samples_all + where id != NEW.id and code = NEW.code and samp_id_part_of = NEW.samp_id_part_of and dbin_id = NEW.dbin_id; + IF (counter > 0) THEN + RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample with the same code and being the part of the same container already exists.', NEW.code; + END IF; + ELSIF (NEW.space_id is not NULL) THEN + SELECT count(*) into counter FROM samples_all + where id != NEW.id and code = NEW.code and samp_id_part_of = NEW.samp_id_part_of and space_id = NEW.space_id; + IF (counter > 0) THEN + RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because space sample with the same code and being the part of the same container already exists.', NEW.code; + END IF; + END IF; + END IF; + + RETURN NEW; +END; +$$ LANGUAGE 'plpgsql'; + +CREATE TRIGGER SAMPLE_CODE_UNIQUENESS_CHECK BEFORE INSERT OR UPDATE ON SAMPLES_ALL + FOR EACH ROW EXECUTE PROCEDURE SAMPLE_CODE_UNIQUENESS_CHECK(); + + +CREATE OR REPLACE FUNCTION SAMPLE_SUBCODE_UNIQUENESS_CHECK() RETURNS trigger AS $$ +DECLARE + counter INTEGER; + unique_subcode BOOLEAN_CHAR; +BEGIN + LOCK TABLE samples_all IN EXCLUSIVE MODE; + + SELECT is_subcode_unique into unique_subcode FROM sample_types WHERE id = NEW.saty_id; + + IF (unique_subcode) THEN + IF (NEW.dbin_id is not NULL) THEN + SELECT count(*) into counter FROM samples_all + where id != NEW.id and code = NEW.code and saty_id = NEW.saty_id and dbin_id = NEW.dbin_id; + IF (counter > 0) THEN + RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because database instance sample of the same type with the same subcode already exists.', NEW.code; + END IF; + ELSIF (NEW.space_id is not NULL) THEN + SELECT count(*) into counter FROM samples_all + where id != NEW.id and code = NEW.code and saty_id = NEW.saty_id and space_id = NEW.space_id; + IF (counter > 0) THEN + RAISE EXCEPTION 'Insert/Update of Sample (Code: %) failed because space sample of the same type with the same subcode already exists.', NEW.code; + END IF; + END IF; + END IF; + + RETURN NEW; +END; +$$ LANGUAGE 'plpgsql'; + +CREATE TRIGGER SAMPLE_SUBCODE_UNIQUENESS_CHECK BEFORE INSERT OR UPDATE ON SAMPLES_ALL + FOR EACH ROW EXECUTE PROCEDURE SAMPLE_SUBCODE_UNIQUENESS_CHECK(); + +------------------------------------------------------------------------------------ +-- Purpose: Create trigger MATERIAL/SAMPLE/EXPERIMENT/DATA_SET _PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK +-- It checks that if material property value is assigned to the entity, +-- then the material type is equal to the one described by property type. +------------------------------------------------------------------------------------ + +CREATE OR REPLACE FUNCTION MATERIAL_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK() RETURNS trigger AS $$ +DECLARE + v_type_id CODE; + v_type_id_prop CODE; +BEGIN + if NEW.mate_prop_id IS NOT NULL then + -- find material type id of the property type + select pt.maty_prop_id into v_type_id_prop + from material_type_property_types etpt, property_types pt + where NEW.mtpt_id = etpt.id AND etpt.prty_id = pt.id; + + if v_type_id_prop IS NOT NULL then + -- find material type id of the material which consists the entity's property value + select entity.maty_id into v_type_id + from materials entity + where NEW.mate_prop_id = entity.id; + if v_type_id != v_type_id_prop then + RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', + NEW.mate_prop_id, v_type_id, v_type_id_prop; + end if; + end if; + end if; + RETURN NEW; +END; +$$ LANGUAGE 'plpgsql'; + +CREATE TRIGGER MATERIAL_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK BEFORE INSERT OR UPDATE ON material_properties + FOR EACH ROW EXECUTE PROCEDURE MATERIAL_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK(); + +CREATE OR REPLACE FUNCTION SAMPLE_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK() RETURNS trigger AS $$ +DECLARE + v_type_id CODE; + v_type_id_prop CODE; +BEGIN + if NEW.mate_prop_id IS NOT NULL then + -- find material type id of the property type + select pt.maty_prop_id into v_type_id_prop + from sample_type_property_types etpt, property_types pt + where NEW.stpt_id = etpt.id AND etpt.prty_id = pt.id; + + if v_type_id_prop IS NOT NULL then + -- find material type id of the material which consists the entity's property value + select entity.maty_id into v_type_id + from materials entity + where NEW.mate_prop_id = entity.id; + if v_type_id != v_type_id_prop then + RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', + NEW.mate_prop_id, v_type_id, v_type_id_prop; + end if; + end if; + end if; + RETURN NEW; +END; +$$ LANGUAGE 'plpgsql'; + +CREATE TRIGGER SAMPLE_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK BEFORE INSERT OR UPDATE ON sample_properties + FOR EACH ROW EXECUTE PROCEDURE SAMPLE_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK(); + +CREATE OR REPLACE FUNCTION EXPERIMENT_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK() RETURNS trigger AS $$ +DECLARE + v_type_id CODE; + v_type_id_prop CODE; +BEGIN + if NEW.mate_prop_id IS NOT NULL then + -- find material type id of the property type + select pt.maty_prop_id into v_type_id_prop + from experiment_type_property_types etpt, property_types pt + where NEW.etpt_id = etpt.id AND etpt.prty_id = pt.id; + + if v_type_id_prop IS NOT NULL then + -- find material type id of the material which consists the entity's property value + select entity.maty_id into v_type_id + from materials entity + where NEW.mate_prop_id = entity.id; + if v_type_id != v_type_id_prop then + RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', + NEW.mate_prop_id, v_type_id, v_type_id_prop; + end if; + end if; + end if; + RETURN NEW; +END; +$$ LANGUAGE 'plpgsql'; + +CREATE TRIGGER EXPERIMENT_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK BEFORE INSERT OR UPDATE ON experiment_properties + FOR EACH ROW EXECUTE PROCEDURE EXPERIMENT_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK(); + + -- data set +CREATE OR REPLACE FUNCTION DATA_SET_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK() RETURNS trigger AS $$ +DECLARE + v_type_id CODE; + v_type_id_prop CODE; +BEGIN + if NEW.mate_prop_id IS NOT NULL then + -- find material type id of the property type + select pt.maty_prop_id into v_type_id_prop + from data_set_type_property_types dstpt, property_types pt + where NEW.dstpt_id = dstpt.id AND dstpt.prty_id = pt.id; + + if v_type_id_prop IS NOT NULL then + -- find material type id of the material which consists the entity's property value + select entity.maty_id into v_type_id + from materials entity + where NEW.mate_prop_id = entity.id; + if v_type_id != v_type_id_prop then + RAISE EXCEPTION 'Insert/Update of property value referencing material (id: %) failed, as referenced material type is different than expected (id %, expected id: %).', + NEW.mate_prop_id, v_type_id, v_type_id_prop; + end if; + end if; + end if; + RETURN NEW; +END; +$$ LANGUAGE 'plpgsql'; + +CREATE TRIGGER DATA_SET_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK BEFORE INSERT OR UPDATE ON data_set_properties + FOR EACH ROW EXECUTE PROCEDURE DATA_SET_PROPERTY_WITH_MATERIAL_DATA_TYPE_CHECK(); + +---------------------------------------------------------------------------------------------------- +-- Purpose: Create DEFERRED triggers for checking consistency of deletion state. +---------------------------------------------------------------------------------------------------- +-- utility function describing a deletion + +CREATE OR REPLACE FUNCTION deletion_description(del_id TECH_ID) RETURNS VARCHAR AS $$ +DECLARE + del_person VARCHAR; + del_date VARCHAR; + del_reason VARCHAR; +BEGIN + SELECT p.last_name || ' ' || p.first_name || ' (' || p.email || ')', + to_char(d.registration_timestamp, 'YYYY-MM-DD HH:MM:SS'), d.reason + INTO del_person, del_date, del_reason FROM deletions d, persons p + WHERE d.pers_id_registerer = p.id AND d.id = del_id; + RETURN 'deleted by ' || del_person || ' on ' || del_date || ' with reason: "' || del_reason || '"'; +END; +$$ LANGUAGE 'plpgsql'; + +---------------------------------------------------------------------------------------------------- +-- 1. data set +--- on insert/update - experiment, sample can't be deleted unless the data set is delete +--- - parents/children relationship stays unchanged + +CREATE OR REPLACE FUNCTION check_created_or_modified_data_set_owner_is_alive() RETURNS trigger AS $$ +DECLARE + owner_code CODE; + owner_del_id TECH_ID; +BEGIN + IF (NEW.del_id IS NOT NULL) THEN + RETURN NEW; + END IF; + + -- check sample + IF (NEW.samp_id IS NOT NULL) THEN + SELECT del_id, code INTO owner_del_id, owner_code + FROM samples + WHERE id = NEW.samp_id; + IF (owner_del_id IS NOT NULL) THEN + RAISE EXCEPTION 'Data Set (Code: %) cannot be connected to a Sample (Code: %) %.', + NEW.code, owner_code, deletion_description(owner_del_id); + END IF; + END IF; + -- check experiment + SELECT del_id, code INTO owner_del_id, owner_code + FROM experiments + WHERE id = NEW.expe_id; + IF (owner_del_id IS NOT NULL) THEN + RAISE EXCEPTION 'Data Set (Code: %) cannot be connected to an Experiment (Code: %) %.', + NEW.code, owner_code, deletion_description(owner_del_id); + END IF; + RETURN NEW; +END; +$$ LANGUAGE 'plpgsql'; + +CREATE CONSTRAINT TRIGGER check_created_or_modified_data_set_owner_is_alive + AFTER INSERT OR UPDATE ON data_all + DEFERRABLE INITIALLY DEFERRED + FOR EACH ROW + EXECUTE PROCEDURE check_created_or_modified_data_set_owner_is_alive(); + +---------------------------------------------------------------------------------------------------- +-- 2. sample +--- on insert/update -> experiment can't be deleted unless the sample is deleted +--- deletion +----> all directly connected data sets need to be deleted +----> all components and children need to be deleted + +CREATE OR REPLACE FUNCTION check_created_or_modified_sample_owner_is_alive() RETURNS trigger AS $$ +DECLARE + owner_code CODE; + owner_del_id TECH_ID; +BEGIN + IF (NEW.del_id IS NOT NULL) THEN + RETURN NEW; + END IF; + + -- check experiment (can't be deleted) + IF (NEW.expe_id IS NOT NULL) THEN + SELECT del_id, code INTO owner_del_id, owner_code + FROM experiments + WHERE id = NEW.expe_id; + IF (owner_del_id IS NOT NULL) THEN + RAISE EXCEPTION 'Sample (Code: %) cannot be connected to an Experiment (Code: %) %.', + NEW.code, owner_code, deletion_description(owner_del_id); + END IF; + END IF; + RETURN NEW; +END; +$$ LANGUAGE 'plpgsql'; + +CREATE CONSTRAINT TRIGGER check_created_or_modified_sample_owner_is_alive + AFTER INSERT OR UPDATE ON samples_all + DEFERRABLE INITIALLY DEFERRED + FOR EACH ROW + EXECUTE PROCEDURE check_created_or_modified_sample_owner_is_alive(); + +CREATE OR REPLACE FUNCTION check_deletion_consistency_on_sample_deletion() RETURNS trigger AS $$ +DECLARE + counter INTEGER; +BEGIN + IF (OLD.del_id IS NOT NULL OR NEW.del_id IS NULL) THEN + RETURN NEW; + END IF; + + -- all directly connected data sets need to be deleted + -- check datasets + SELECT count(*) INTO counter + FROM data + WHERE data.samp_id = NEW.id AND data.del_id IS NULL; + IF (counter > 0) THEN + RAISE EXCEPTION 'Sample (Code: %) deletion failed because at least one of its data sets was not deleted.', NEW.code; + END IF; + -- all components need to be deleted + SELECT count(*) INTO counter + FROM samples + WHERE samples.samp_id_part_of = NEW.id AND samples.del_id IS NULL; + IF (counter > 0) THEN + RAISE EXCEPTION 'Sample (Code: %) deletion failed because at least one of its component samples was not deleted.', NEW.code; + END IF; + -- all children need to be deleted + SELECT count(*) INTO counter + FROM sample_relationships sr, samples sc + WHERE sample_id_parent = NEW.id AND sc.id = sr.sample_id_child AND sc.del_id IS NULL; + IF (counter > 0) THEN + RAISE EXCEPTION 'Sample (Code: %) deletion failed because at least one of its child samples was not deleted.', NEW.code; + END IF; + RETURN NEW; +END; +$$ LANGUAGE 'plpgsql'; + +CREATE CONSTRAINT TRIGGER check_deletion_consistency_on_sample_deletion + AFTER UPDATE ON samples_all + DEFERRABLE INITIALLY DEFERRED + FOR EACH ROW + EXECUTE PROCEDURE check_deletion_consistency_on_sample_deletion(); + +---------------------------------------------------------------------------------------------------- +-- 3. experiment +--- deletion -> all directly connected samples and data sets need to be deleted + +CREATE OR REPLACE FUNCTION check_deletion_consistency_on_experiment_deletion() RETURNS trigger AS $$ +DECLARE + counter INTEGER; +BEGIN + IF (OLD.del_id IS NOT NULL OR NEW.del_id IS NULL) THEN + RETURN NEW; + END IF; + + -- check datasets + SELECT count(*) INTO counter + FROM data + WHERE data.expe_id = NEW.id AND data.del_id IS NULL; + IF (counter > 0) THEN + RAISE EXCEPTION 'Experiment (Code: %) deletion failed because at least one of its data sets was not deleted.', NEW.code; + END IF; + -- check samples + SELECT count(*) INTO counter + FROM samples + WHERE samples.expe_id = NEW.id AND samples.del_id IS NULL; + IF (counter > 0) THEN + RAISE EXCEPTION 'Experiment (Code: %) deletion failed because at least one of its samples was not deleted.', NEW.code; + END IF; + RETURN NEW; +END; +$$ LANGUAGE 'plpgsql'; + +CREATE CONSTRAINT TRIGGER check_deletion_consistency_on_experiment_deletion + AFTER UPDATE ON experiments_all + DEFERRABLE INITIALLY DEFERRED + FOR EACH ROW + EXECUTE PROCEDURE check_deletion_consistency_on_experiment_deletion(); + +---------------------------------------------------------------------------------------------------- +-- Rules for views +---------------------------------------------------------------------------------------------------- + +CREATE OR REPLACE RULE sample_insert AS + ON INSERT TO samples DO INSTEAD + INSERT INTO samples_all ( + id, + code, + dbin_id, + del_id, + expe_id, + modification_timestamp, + perm_id, + pers_id_registerer, + registration_timestamp, + samp_id_part_of, + saty_id, + space_id + ) VALUES ( + NEW.id, + NEW.code, + NEW.dbin_id, + NEW.del_id, + NEW.expe_id, + NEW.modification_timestamp, + NEW.perm_id, + NEW.pers_id_registerer, + NEW.registration_timestamp, + NEW.samp_id_part_of, + NEW.saty_id, + NEW.space_id + ); + +CREATE OR REPLACE RULE sample_update AS + ON UPDATE TO samples DO INSTEAD + UPDATE samples_all + SET code = NEW.code, + dbin_id = NEW.dbin_id, + del_id = NEW.del_id, + expe_id = NEW.expe_id, + modification_timestamp = NEW.modification_timestamp, + perm_id = NEW.perm_id, + pers_id_registerer = NEW.pers_id_registerer, + registration_timestamp = NEW.registration_timestamp, + samp_id_part_of = NEW.samp_id_part_of, + saty_id = NEW.saty_id, + space_id = NEW.space_id + WHERE id = NEW.id; + +CREATE OR REPLACE RULE sample_delete AS + ON DELETE TO samples DO INSTEAD + DELETE FROM samples_all + WHERE id = OLD.id; + +CREATE OR REPLACE RULE sample_deleted_update AS + ON UPDATE TO samples_deleted DO INSTEAD + UPDATE samples_all + SET del_id = NEW.del_id, + modification_timestamp = NEW.modification_timestamp + WHERE id = NEW.id; + +CREATE OR REPLACE RULE sample_deleted_delete AS + ON DELETE TO samples_deleted DO INSTEAD + DELETE FROM samples_all + WHERE id = OLD.id; + +---------------- +-- experiment -- +---------------- + +CREATE OR REPLACE RULE experiment_insert AS + ON INSERT TO experiments DO INSTEAD + INSERT INTO experiments_all ( + id, + code, + del_id, + exty_id, + is_public, + mate_id_study_object, + modification_timestamp, + perm_id, + pers_id_registerer, + proj_id, + registration_timestamp + ) VALUES ( + NEW.id, + NEW.code, + NEW.del_id, + NEW.exty_id, + NEW.is_public, + NEW.mate_id_study_object, + NEW.modification_timestamp, + NEW.perm_id, + NEW.pers_id_registerer, + NEW.proj_id, + NEW.registration_timestamp + ); + +CREATE OR REPLACE RULE experiment_update AS + ON UPDATE TO experiments DO INSTEAD + UPDATE experiments_all + SET code = NEW.code, + del_id = NEW.del_id, + exty_id = NEW.exty_id, + is_public = NEW.is_public, + mate_id_study_object = NEW.mate_id_study_object, + modification_timestamp = NEW.modification_timestamp, + perm_id = NEW.perm_id, + pers_id_registerer = NEW.pers_id_registerer, + proj_id = NEW.proj_id, + registration_timestamp = NEW.registration_timestamp + WHERE id = NEW.id; + +CREATE OR REPLACE RULE experiment_delete AS + ON DELETE TO experiments DO INSTEAD + DELETE FROM experiments_all + WHERE id = OLD.id; + +CREATE OR REPLACE RULE experiments_deleted_update AS + ON UPDATE TO experiments_deleted DO INSTEAD + UPDATE experiments_all + SET del_id = NEW.del_id, + modification_timestamp = NEW.modification_timestamp + WHERE id = NEW.id; + +CREATE OR REPLACE RULE experiments_deleted_delete AS + ON DELETE TO experiments_deleted DO INSTEAD + DELETE FROM experiments_all + WHERE id = OLD.id; + +---------- +-- data -- +---------- + +CREATE OR REPLACE RULE data_insert AS + ON INSERT TO data DO INSTEAD + INSERT INTO data_all ( + id, + code, + ctnr_id, + ctnr_order, + del_id, + expe_id, + dast_id, + data_producer_code, + dsty_id, + is_derived, + is_placeholder, + is_valid, + modification_timestamp, + pers_id_registerer, + production_timestamp, + registration_timestamp, + samp_id + ) VALUES ( + NEW.id, + NEW.code, + NEW.ctnr_id, + NEW.ctnr_order, + NEW.del_id, + NEW.expe_id, + NEW.dast_id, + NEW.data_producer_code, + NEW.dsty_id, + NEW.is_derived, + NEW.is_placeholder, + NEW.is_valid, + NEW.modification_timestamp, + NEW.pers_id_registerer, + NEW.production_timestamp, + NEW.registration_timestamp, + NEW.samp_id + ); + +CREATE OR REPLACE RULE data_update AS + ON UPDATE TO data DO INSTEAD + UPDATE data_all + SET code = NEW.code, + ctnr_id = NEW.ctnr_id, + ctnr_order = NEW.ctnr_order, + del_id = NEW.del_id, + expe_id = NEW.expe_id, + dast_id = NEW.dast_id, + data_producer_code = NEW.data_producer_code, + dsty_id = NEW.dsty_id, + is_derived = NEW.is_derived, + is_placeholder = NEW.is_placeholder, + is_valid = NEW.is_valid, + modification_timestamp = NEW.modification_timestamp, + pers_id_registerer = NEW.pers_id_registerer, + production_timestamp = NEW.production_timestamp, + registration_timestamp = NEW.registration_timestamp, + samp_id = NEW.samp_id + WHERE id = NEW.id; + +CREATE OR REPLACE RULE data_all AS + ON DELETE TO data DO INSTEAD + DELETE FROM data_all + WHERE id = OLD.id; + +CREATE OR REPLACE RULE data_deleted_update AS + ON UPDATE TO data_deleted DO INSTEAD + UPDATE data_all + SET del_id = NEW.del_id, + modification_timestamp = NEW.modification_timestamp + WHERE id = NEW.id; + +CREATE OR REPLACE RULE data_deleted_delete AS + ON DELETE TO data_deleted DO INSTEAD + DELETE FROM data_all + WHERE id = OLD.id; + +---------------------------------------------------------------------------------------------------- +-- Rules for properties history +---------------------------------------------------------------------------------------------------- + +-- Material Properties -- + +CREATE OR REPLACE RULE material_properties_update AS + ON UPDATE TO material_properties DO ALSO + INSERT INTO material_properties_history ( + ID, + MATE_ID, + MTPT_ID, + VALUE, + CVTE_ID, + MATE_PROP_ID, + VALID_UNTIL_TIMESTAMP + ) VALUES ( + nextval('MATERIAL_PROPERTY_ID_SEQ'), + OLD.MATE_ID, + OLD.MTPT_ID, + OLD.VALUE, + OLD.CVTE_ID, + OLD.MATE_PROP_ID, + current_timestamp + ); + +-- Experiment Properties -- + +CREATE OR REPLACE RULE experiment_properties_update AS + ON UPDATE TO experiment_properties DO ALSO + INSERT INTO experiment_properties_history ( + ID, + EXPE_ID, + ETPT_ID, + VALUE, + CVTE_ID, + MATE_PROP_ID, + VALID_UNTIL_TIMESTAMP + ) VALUES ( + nextval('EXPERIMENT_PROPERTY_ID_SEQ'), + OLD.EXPE_ID, + OLD.ETPT_ID, + OLD.VALUE, + OLD.CVTE_ID, + OLD.MATE_PROP_ID, + current_timestamp + ); + +-- Sample Properties -- + +CREATE OR REPLACE RULE sample_properties_update AS + ON UPDATE TO sample_properties DO ALSO + INSERT INTO sample_properties_history ( + ID, + SAMP_ID, + STPT_ID, + VALUE, + CVTE_ID, + MATE_PROP_ID, + VALID_UNTIL_TIMESTAMP + ) VALUES ( + nextval('SAMPLE_PROPERTY_ID_SEQ'), + OLD.SAMP_ID, + OLD.STPT_ID, + OLD.VALUE, + OLD.CVTE_ID, + OLD.MATE_PROP_ID, + current_timestamp + ); + +-- Data Set Properties -- + +CREATE OR REPLACE RULE data_set_properties_update AS + ON UPDATE TO data_set_properties DO ALSO + INSERT INTO data_set_properties_history ( + ID, + DS_ID, + DSTPT_ID, + VALUE, + CVTE_ID, + MATE_PROP_ID, + VALID_UNTIL_TIMESTAMP + ) VALUES ( + nextval('DATA_SET_PROPERTY_ID_SEQ'), + OLD.DS_ID, + OLD.DSTPT_ID, + OLD.VALUE, + OLD.CVTE_ID, + OLD.MATE_PROP_ID, + current_timestamp + ); + +CREATE OR REPLACE RULE data_set_relationships_insert AS + ON INSERT TO data_set_relationships DO INSTEAD + INSERT INTO data_set_relationships_all ( + data_id_parent, + data_id_child + ) VALUES ( + NEW.data_id_parent, + NEW.data_id_child + ); + +CREATE OR REPLACE RULE data_set_relationships_delete AS + ON DELETE TO data_set_relationships DO INSTEAD + DELETE FROM data_set_relationships_all + WHERE data_id_parent = OLD.data_id_parent and data_id_child = OLD.data_id_child; + +CREATE OR REPLACE RULE sample_relationships_insert AS + ON INSERT TO sample_relationships DO INSTEAD + INSERT INTO sample_relationships_all ( + id, + sample_id_parent, + relationship_id, + sample_id_child + ) VALUES ( + NEW.id, + NEW.sample_id_parent, + NEW.relationship_id, + NEW.sample_id_child + ); + +CREATE OR REPLACE RULE sample_relationships_update AS + ON UPDATE TO sample_relationships DO INSTEAD + UPDATE sample_relationships_all + SET + sample_id_parent = NEW.sample_id_parent, + relationship_id = NEW.relationship_id, + sample_id_child = NEW.sample_id_child + WHERE id = NEW.id; + +CREATE OR REPLACE RULE sample_relationships_delete AS + ON DELETE TO sample_relationships DO INSTEAD + DELETE FROM sample_relationships_all + WHERE id = OLD.id; diff --git a/openbis/source/sql/postgresql/088/grants-088.sql b/openbis/source/sql/postgresql/088/grants-088.sql new file mode 100644 index 0000000000000000000000000000000000000000..8335414adcd697ffa7ceb11960493bc0cb190656 --- /dev/null +++ b/openbis/source/sql/postgresql/088/grants-088.sql @@ -0,0 +1,98 @@ +-- Granting SELECT privilege to group OPENBIS_READONLY + +GRANT SELECT ON SEQUENCE attachment_content_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE attachment_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE code_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE controlled_vocabulary_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE core_plugin_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE cvte_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE data_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE data_set_property_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE data_set_relationship_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE data_set_type_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE data_store_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE DATA_STORE_SERVICES_ID_SEQ TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE data_type_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE database_instance_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE dstpt_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE etpt_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE event_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE experiment_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE experiment_property_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE experiment_type_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE file_format_type_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE space_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE deletion_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE locator_type_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE material_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE material_property_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE material_type_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE mtpt_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE perm_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE person_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE project_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE property_type_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE role_assignment_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE sample_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE sample_property_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE sample_type_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE stpt_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE authorization_group_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE filter_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON SEQUENCE query_id_seq TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE attachment_contents TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE attachments TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE controlled_vocabularies TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE controlled_vocabulary_terms TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE core_plugins TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE data_all TO GROUP OPENBIS_READONLY; +GRANT SELECT ON data TO GROUP OPENBIS_READONLY; +GRANT SELECT ON data_deleted TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE data_set_properties TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE data_set_properties_history TO GROUP OPENBIS_READONLY; +GRANT SELECT ON data_set_relationships TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE data_set_relationships_all TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE data_set_type_property_types TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE data_set_types TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE data_stores TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE data_types TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE DATA_STORE_SERVICES TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE DATA_STORE_SERVICE_DATA_SET_TYPES TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE database_instances TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE database_version_logs TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE events TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE experiment_properties TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE experiment_properties_history TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE experiment_type_property_types TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE experiment_types TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE experiments_all TO GROUP OPENBIS_READONLY; +GRANT SELECT ON experiments TO GROUP OPENBIS_READONLY; +GRANT SELECT ON experiments_deleted TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE external_data TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE file_format_types TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE spaces TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE deletions TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE locator_types TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE material_properties TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE material_properties_history TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE material_type_property_types TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE material_types TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE materials TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE persons TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE projects TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE property_types TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE role_assignments TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE sample_properties TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE sample_properties_history TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE sample_type_property_types TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE sample_types TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE samples_all TO GROUP OPENBIS_READONLY; +GRANT SELECT ON samples TO GROUP OPENBIS_READONLY; +GRANT SELECT ON samples_deleted TO GROUP OPENBIS_READONLY; +GRANT SELECT ON sample_relationships TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE sample_relationships_all TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE authorization_groups TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE authorization_group_persons TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE filters TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE queries TO GROUP OPENBIS_READONLY; +GRANT SELECT ON TABLE scripts TO GROUP OPENBIS_READONLY; diff --git a/openbis/source/sql/postgresql/migration/migration-087-088.sql b/openbis/source/sql/postgresql/migration/migration-087-088.sql new file mode 100644 index 0000000000000000000000000000000000000000..495f55451c72d7b5483076c8c390412cdbac0b15 --- /dev/null +++ b/openbis/source/sql/postgresql/migration/migration-087-088.sql @@ -0,0 +1,2 @@ +-- Migration from 087 to 088 +-- Should be empty, all the changes are in the HCS branch \ No newline at end of file diff --git a/screening/dist/core-plugins/screening/1/as/initialize-master-data.py b/screening/dist/core-plugins/screening/1/as/initialize-master-data.py index 8fa9cad4dc4eefe6b5f5582a49bf0982431405b0..795a27ca747ca7f449c388855a0affac1c42fd4c 100644 --- a/screening/dist/core-plugins/screening/1/as/initialize-master-data.py +++ b/screening/dist/core-plugins/screening/1/as/initialize-master-data.py @@ -178,6 +178,10 @@ data_set_type_HCS_IMAGE_SEGMENTATION = tr.createNewDataSetType('HCS_IMAGE_SEGMEN data_set_type_HCS_IMAGE_SEGMENTATION.setDescription('HCS Segmentation Images (overlays).') data_set_type_HCS_IMAGE_SEGMENTATION.setContainerType(False) +data_set_type_HCS_IMAGE_CONTAINER = tr.createNewDataSetType('HCS_IMAGE_CONTAINER') +data_set_type_HCS_IMAGE_CONTAINER.setDescription('Container for HCS images of different resolutions (raw, overviews, thumbnails).') +data_set_type_HCS_IMAGE_CONTAINER.setContainerType(True) + # Exists in the database by default #data_set_type_UNKNOWN = tr.createNewDataSetType('UNKNOWN') #data_set_type_UNKNOWN.setDescription('Unknown') diff --git a/screening/source/sql/postgresql/migration/migration-087-088.sql b/screening/source/sql/postgresql/migration/migration-087-088.sql new file mode 100644 index 0000000000000000000000000000000000000000..28e4e6f6c92c23f8aae396e8cd3d3e436a4f0d3b --- /dev/null +++ b/screening/source/sql/postgresql/migration/migration-087-088.sql @@ -0,0 +1,21 @@ +-- Migration from 087 to 088 + +CREATE OR REPLACE FUNCTION create_image_container_data_set_type() RETURNS void AS $$ +DECLARE + container_id TECH_ID; +BEGIN + select id into container_id from data_set_types where code = 'HCS_IMAGE_CONTAINER'; + if container_id is null then + insert into data_set_types(id, code, description, is_container, dbin_id) + values (nextval('DATA_SET_TYPE_ID_SEQ'), + 'HCS_IMAGE_CONTAINER', + 'Container for HCS images of different resolutions (raw, overviews, thumbnails).', + 'T', + (select id from database_instances where is_original_source = 'T')); + end if; +END; +$$ LANGUAGE 'plpgsql'; + +SELECT create_image_container_data_set_type(); +DROP FUNCTION create_image_container_data_set_type(); +