Создайте IBM DB2 CHECK для даты, большей или равной текущей дате - PullRequest
0 голосов
/ 02 марта 2010

Я пытаюсь создать таблицу с полем, имеющим начальную дату, я хочу поставить чек, чтобы убедиться, что нельзя ввести дату до сегодняшнего дня. Это код, который у меня пока есть для этого таблица

CREATE TABLE client_service (
    NHS_num Varchar(10) NOT NULL,
    service_id Integer NOT NULL,
    starting_date Date NOT NULL CHECK(starting_date >= CURDATE()),
    num_weeks Integer NOT NULL CHECK(num_weeks > 0),
    client_contribution Decimal(10,2) NOT NULL CHECK(client_contribution >= 0),
    CONSTRAINT PrimaryKey PRIMARY KEY (
            NHS_num,
            service_id,
            starting_date
    )
);

Ответы [ 2 ]

2 голосов
/ 03 марта 2010

Согласно документации для CREATE TABLE:

The search-condition cannot contain any of the following (SQLSTATE 42621):
* Subqueries
* XMLQUERY or XMLEXISTS expressions
* Dereference operations or DEREF functions where the scoped reference argument is other than the object identifier (OID) column
* CAST specifications with a SCOPE clause
* Column functions
* Functions that are not deterministic
* Functions defined to have an external action
* User-defined functions defined with either CONTAINS SQL or READS SQL DATA
* Host variables
* Parameter markers
* Special registers
* Global variables
* References to generated columns other than the identity column
* References to columns of type XML (except in a VALIDATED predicate)
* An error tolerant nested-table-expression

Итак, как предположил Лесли, правильный способ сделать это - использовать триггер BEFORE INSERT.

1 голос
/ 02 марта 2010

Я думаю, что проблема заключается в использовании функции CURDATE в проверке. Я запустил этот пример:
CREATE TABLE EMP<br> (ID SMALLINT NOT NULL,<br> NAME VARCHAR(9),<br> DEPT SMALLINT CHECK (DEPT BETWEEN 10 AND 100),<br> JOB CHAR(5) CHECK (JOB IN ('Sales', 'Mgr', 'Clerk')),<br> HIREDATE DATE,<br> SALARY DECIMAL(7,2),<br> COMM DECIMAL(7,2),<br> PRIMARY KEY (ID),<br> CONSTRAINT YEARSAL CHECK (YEAR(HIREDATE) >= 1986 OR SALARY > 40500) )

и все работало просто отлично. Я изменил это на это:
CREATE TABLE landrews.EMP<br> (ID SMALLINT NOT NULL,<br> NAME VARCHAR(9),<br> DEPT SMALLINT CHECK (DEPT BETWEEN 10 AND 100),<br> JOB CHAR(5) CHECK (JOB IN ('Sales', 'Mgr', 'Clerk')),<br> HIREDATE DATE,<br> SALARY DECIMAL(7,2),<br> COMM DECIMAL(7,2),<br> PRIMARY KEY (ID),<br> CONSTRAINT YEARSAL CHECK (HIREDATE >= CURDATE() ) )
и он отклонил его с сообщением об ошибке, которое включает следующее: Условие CHECK использует функцию столбца или UDF

...