Создать триггер предотвратить вставку - PullRequest
11 голосов
/ 23 ноября 2010

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

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.</p>

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

1 Ответ

17 голосов
/ 23 ноября 2010

Пример «Использование триггера DML AFTER для принудительного применения бизнес-правила между таблицами PurchaseOrderHeader и Vendor» в CREATE TRIGGER Документация MSDN точно соответствует тому, что вы ищете:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...