2010-11-23 3 views
8

Я пытаюсь выполнить следующий триггер:Создать триггер предотвращения вставки

create trigger t23 
on studies 
after insert, update, delete 
as 
begin 
REFERENCING NEW ROW NewStudent 
FOR EACH ROW 
WHEN (30 <= (SELECT SUM(credits) FROM Studies) 
DELETE FROM NewStudent N 
WHERE N.spnr = NewStudent.spnr 
end 

Я пытаюсь создать триггер, который вставляет только студент, если кредиты является < или == в «30». «Кредиты» - это тип int.

У меня возникают многочисленные ошибки, пытающиеся реализовать этот триггер. Я действительно пробовал все, и у меня нет вариантов. Может ли кто-нибудь, кто эксперт в области, указать мне в правильном направлении?

+1

Какая СУБД вы используете? – 2013-08-26 07:49:34

ответ

12

Пример «Использование 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 таблица проверки ограничений, если студент прошел курс, и отменяет вставку, если это необходимо. Однако лучше проверить это на прикладном уровне.

+1

+1 для упоминания «... лучше проверить это на прикладном уровне». – BigM 2014-10-16 08:10:43

Смежные вопросы