2012-03-11 2 views
0

Возможно ли добавить целостность данных между столбцами в разных таблицах SQL Server? У меня есть стол Pay with column Дата и таблица Заказы с графом DateofOrder. И я хотел бы добавить целостность данных, так что Дата не может быть раньше DateofOrder. И когда пользователь вставляет туда ту же дату или даже более раннюю базу данных, будет отображаться ошибка.Dataintegrity между таблицами в SQL Server

ответ

0

I думаю вы имеете в виду что-то вроде этого, здесь сделано с помощью триггера;

CREATE TRIGGER trig_pay ON Pay 
FOR INSERT, UPDATE 
AS 
IF EXISTS(SELECT * 
     FROM [Order] o 
     JOIN inserted i 
     ON o.id = i.payment_id 
     WHERE DateOfOrder>[date]) 
BEGIN 
    RAISERROR ('Sorry, Dave', 16, 1) 
    ROLLBACK; 
    RETURN; 
END 

INSERT INTO [Order] values (1, GETDATE());    -- Order today 
INSERT INTO Pay values (1, DATEADD(dd, -1, getdate())); -- Pay yesterday 
> Sorry, Dave 
+0

Спасибо, отлично работает! – Dexter101

0

Вам нужно использовать триггер INSTEAD OF или AFTER, чтобы выполнить это, вы не можете сделать это декларативно. Ну, вы можете использовать ограничение проверки с TVF или что-то еще, но я никогда не пробовал это.

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

+0

Сначала я вставить Заказать дату, например. 2012-03-11, а затем я перехожу к таблице Pay и вставляю дату, например. 2012-03-15 (конечно, это может быть 2012-03-11), но это не может быть 2012-03-01 В моих классах мы используем только Microsoft SQL Server Management Studio. – Dexter101

+0

Можете ли вы показать мне пример кода моей проблемы? И предположим, что Order and Pay являются единственными таблицами в базе данных с только столбцами DateofOrder и Date. – Dexter101

+0

Если вы можете объяснить, как связаны ваши таблицы, я мог бы сделать снимок. Вы имеете в виду, когда вы вставляете заказ, не может быть более ранней даты в таблице оплаты вообще, или нет более ранней даты для строки, которая имеет что-то вообще для того, чтобы сделать заказ, который вы только что вставили? –

0

Возможно, не прибегая к триггерам.

Идея заключается в том, чтобы добавить DateofOrder в Orders таблице его существующий ключ - давайте назовем его order_id - создать соединение суперключ, затем ссылаться на этот суперключ (вместо простого ключа исключительно order_id) в Pay таблице ,

Вот голые кости:

CREATE TABLE Orders 
(
order_id CHAR(10) NOT NULL, 
DateofOrder DATE NOT NULL, 
UNIQUE (order_id), -- simple candidate key 
UNIQUE (DateofOrder, order_id) -- compund superkey 
); 

CREATE TABLE Pay 
(
order_id CHAR(10) NOT NULL, 
DateofOrder DATE NOT NULL, 
FOREIGN KEY (DateofOrder, order_id) 
    REFERENCES Orders (DateofOrder, order_id), 
DateOfPayment DATE NOT NULL, 
CHECK (DateofOrder < DateOfPayment), 
UNIQUE (order_id) 
); 
Смежные вопросы