PostgreSQl. Ограничение(функция) неверна. Как реализовать такое ограничение

Ненадежный (Rating<6.0) поставщик не может поставлять дорогие (Price>1000.0) детали.

CREATE TABLE IF NOT EXISTS Details
(
    Id Serial PRIMARY KEY,--Id детали (служебное поле, ключ, автоинкремент)
    Name VARCHAR(255) NOT NULL,--Имя (текстовое, обязательное)
    Price DOUBLE PRECISION NOT NULL, --Цена детали (текстовое, обязательное)
    Check(Price>0), --Цена не может быть отрицательной
    
    Color VARCHAR(255) NOT NULL, --Цвет детали (текстовое, обязательное)
    Check(Color IN ('белый','черный','красный','синий','серый','зеленый',
         'желтый','оранжевый','коричневый')),
    --Цвет детали должен входить в фиксированный набор значений
    Weight DOUBLE PRECISION NOT NULL,-- Вес детали В ГРАММАХ 
    --(дробное, обязательное)
    Check(Weight>0.0)--Вес не может быть отрицательным
);

CREATE TABLE IF NOT EXISTS Suppliers
(
    Id Serial PRIMARY KEY,--Id поставщика (служебное поле, ключ, автоинкремент)
    Name VARCHAR(255) NOT NULL,--Название поставщика (текстовое, обязательное)
    
    City VARCHAR(255) NOT NULL,--Город поставщика (текстовое, обязательное)
    Address VARCHAR(255) NOT NULL DEFAULT 'Неизвестен',--Адрес поставщика 
    --(текстовое, обязательное)
    Rating DOUBLE PRECISION NOT NULL,--Рейтинг (дробное, обязательное)
    CHECK(Rating>=1.0 AND Rating <=10.0),--Рейтинг должен быть больше или равен 1
    --и меньше или равен 10
    Unique(Name,City)
);

CREATE TABLE IF NOT EXISTS Projects
(
    Id Serial PRIMARY KEY,--Id проекта (служебное поле, ключ, автоинкремент)
    Name VARCHAR(255) NOT NULL,--Имя (текстовое, обязательное)
    City VARCHAR(127) NOT NULL,
    Address VARCHAR(255) NOT NULL,--Адрес (текстовое, обязательное)
    Budget DOUBLE PRECISION NOT NULL,--Бюджет (дробное, обязательное)
    CHECK(Budget>0.0)--Бюджет не может быть отрицательным
);

CREATE TABLE IF NOT EXISTS Supplies
(
    Id Serial PRIMARY KEY,--Id проекта (служебное поле, ключ, автоинкремент)
    DetailId INT NOT NULL,--Id детали поставки (внешний ключ) 
    --(в одной поставке-одна деталь)
    --(внешний ключ)
    DetailQuantity SMALLINT NOT NULL, --Количество деталей(конкретной детали)
    --в поставке
    Check(DetailQuantity>0),--Количество деталей (конкретноц детали)
    --в поставке не может быть отрицательным
    ProjectId INT NOT NULL,--Id проекта (внешний ключ)
    
    SupplierId INT NOT NULL,--Id поставщика (внешний ключ)
    
    
    FOREIGN KEY(DetailId) REFERENCES Details(Id) 
    ON DELETE CASCADE ON UPDATE CASCADE,
    --Удаляется деталь - удаляется поставка с деталью,
    --Обновляется деталь - обновляется поставка с деталью
    
    FOREIGN KEY(ProjectId) REFERENCES Projects(Id) 
    ON DELETE CASCADE ON UPDATE CASCADE,
    --Удаляется проект - удаляется поставка в рамках проекта,
    --Обновляется проект - обнавляется поставка в рамках проекта
    
    FOREIGN KEY(SupplierId) REFERENCES Suppliers(Id) 
    ON DELETE CASCADE ON UPDATE CASCADE
    --Удаляется деталь - удаляется поставка с деталью,
    --Обновляется деталь - обновляется поставка с деталью
);

CREATE OR REPLACE FUNCTION Suppliers_And_Details_On_Insert_Supplies_Validate() RETURNS trigger AS $Suppliers_And_Details_On_Insert_Supplies_Validate$
    BEGIN
        
        IF (Rating < 6.0 AND Price>1000)
            THEN
            RAISE EXCEPTION 'Unreliable supplier cannot supply an expensive detail';
        END IF;
        RETURN NEW;
    END;
$Suppliers_And_Details_On_Insert_Supplies_Validate$ LANGUAGE plpgsql;

CREATE TRIGGER supplies_validate BEFORE INSERT OR UPDATE ON Supplies
    FOR EACH ROW EXECUTE PROCEDURE Suppliers_And_Details_On_Insert_Supplies_Validate();

INSERT INTO Supplies(DetailId,DetailQuantity,ProjectId,SupplierId)
Values 
(1,500,1,1),(2,1000,2,2)...;

Rating - рейтинг поставщика (Suppliers) (связанная с Supplies таблица) в диапазоне от 1 до 10 включительно. Price - Цена детали (Details) (связанная с Supplies таблица). Ненадежные (Suppliers.Rating<6.0) поставщики не могут поставлять дорогие (Details.Price>1000) детали. On Insert, On Update Trigger.


Ответы (0 шт):