Пример «Использование DML ПОСЛЕ триггера для обеспечения бизнес-правил между PurchaseOrderHeader и Vendor таблицами» в документации MSDN CREATE TRIGGER делает exaclty то, что вы ищете:
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('Purchasing.LowCredit','TR') IS NOT NULL
DROP TRIGGER Purchasing.LowCredit;
GO
-- This trigger prevents a row from being inserted in the Purchasing.PurchaseOrderHeader table
-- when the credit rating of the specified vendor is set to 5 (below average).
CREATE TRIGGER Purchasing.LowCredit ON Purchasing.PurchaseOrderHeader
AFTER INSERT
AS
DECLARE @creditrating tinyint, @vendorid int;
IF EXISTS (SELECT *
FROM Purchasing.PurchaseOrderHeader p
JOIN inserted AS i
ON p.PurchaseOrderID = i.PurchaseOrderID
JOIN Purchasing.Vendor AS v
ON v.BusinessEntityID = p.VendorID
WHERE v.CreditRating = 5
)
BEGIN
RAISERROR ('This vendor''s credit rating is too low to accept new purchase orders.', 16, 1);
ROLLBACK TRANSACTION;
RETURN
END;
Ключевой момент здесь является ROLLBACK TRANSACTION
, просто адаптируйте пример в соответствии с вашими потребностями, и все готово.
Редактировать: Это должно выполнить то, что вы ищете, но я не проверял его, поэтому ваш пробег может отличаться.
create trigger dbo.something after insert as
begin
if exists (select * from inserted where sum(credits) > 30)
begin
rollback transaction
raiserror ('some message', 16, 1)
end
end
Другой редактировать, основываясь на некоторых предположениях (обратите внимание, я написал этот сценарий на лету, так как я не могу проверить это прямо сейчас):
create table dbo.students
(
student_id int not null,
name varchar (50) not null
)
create table dbo.courses
(
course_id int not null,
name varchar (50) not null,
required_credits int not null
)
create table dbo.results
(
student_id int not null,
course_id int not null,
course_result int not null
)
create trigger dbo.check_student_results on dbo.results after insert as
(
declare @check int
select @check = count(*)
from inserted as a
join dbo.courses as b on b.course_id = a.course_id
where b.required_credits > a.course.result
if @check <> 0
begin
rollback transaction
raiserror('The student did not pass the course.', 16, 1)
end
)
Таким образом при вставке записей в dbo.results
таблица проверки ограничений, если студент прошел курс, и отменяет вставку, если это необходимо. Однако лучше проверить это на прикладном уровне.
Какая СУБД вы используете? – 2013-08-26 07:49:34