Я предлагаю вам две таблицы: промежуточную таблицу для хранения необработанных данных из внешней программы и вторую таблицу, к которой были применены бизнес-правила. Эта вторая таблица может быть просто VIEW
, который запрашивает данные, применяя правила, например (Я использую CTE для имитации промежуточной таблицы с примерами данных; также SQL Server не имеет истинного логического типа, поэтому я имитирую его с помощью столбца CHAR(1)
, и имя делает мою голову так, чтобы я изменит его на some_flag
!):
WITH Staging
AS
(
SELECT *
FROM (
VALUES (0, 3750, 'T'),
(1, 5000, 'T'),
(2, 5000, 'F')
) AS T (ROW, ValueA, some_flag)
)
SELECT ROW, ValueA, some_flag,
0 AS ValueB
FROM Staging
WHERE ( ValueA <= 3750 OR some_flag = 'T' )
UNION
SELECT ROW, 3750 AS ValueA, some_flag,
( ValueA - 3750 ) AS ValueB
FROM Staging
WHERE ValueA > 3750 AND some_flag = 'F';
Если вы хотите, чтобы вторая таблица была базовой, то, похоже, применяются следующие ограничения (с использованием традиционной логики):
IF some_flag = 'F' THEN ValueA <= 3750
IF some_flag = 'T' THEN ValueB = 0
IF some_flag = 'F' AND ValueA < 3750 THEN ValueB = 0
В SQL как CHECK
ограничения (я угадал некоторые бизнес-правила «здравого смысла»):
CREATE TABLE MyTable
(
ROW INTEGER NOT NULL UNIQUE,
ValueA INTEGER NOT NULL CHECK ( ValueA > 0 ),
some_flag CHAR(1) NOT NULL CHECK ( some_flag IN ( 'T', 'F' ) ),
ValueB INTEGER NOT NULL CHECK ( ValueB >= 0 ),
CHECK ( some_flag <> 'F' OR ValueA <= 3750 ),
CHECK ( some_flag <> 'T' OR ValueB = 0 ),
CHECK ( some_flag <> 'F' OR ValueA >= 3750 OR ValueB = 0 )
);
Затем вы можете использовать вышеупомянутый запрос для копирования данных из промежуточной таблицы в базовую таблицу, не нарушая при этом никаких ограничений, но при этом понимая, что если вы ошиблись в запросе, процедура потерпит неудачу!