SQL Server 2008 Транзакция завершилась в триггере.Пакет был прерван - PullRequest
1 голос
/ 15 июня 2011

Я получил эту хранимую процедуру:

CREATE PROCEDURE getManagerSalary 
(
@Emp_id         INT,
@ManagerSalary  MONEY OUTPUT
)
AS
SELECT @ManagerSalary = es.Salary
FROM [outdoorparadise].[dbo].[Employee] AS e 
INNER JOIN 
    [outdoorparadise].[dbo].[Employee] AS m
    ON e.Manager_id = m.Emp_id
INNER JOIN
    [outdoorparadise].[dbo].[Employee_staff] AS es
    ON e.Manager_id = es.Emp_staff_code
WHERE e.Emp_id = @Emp_id;

Я получил этот триггер:

CREATE TRIGGER checkSalary ON Employee_staff
AFTER UPDATE
AS
    DECLARE
    @Emp_id INT,
    @NewSalary MONEY,
    @ManagerSalary MONEY;

    SELECT @NewSalary = Salary
    FROM inserted;

    SELECT @Emp_id = Emp_staff_code
    FROM inserted;

    EXEC getManagerSalary @Emp_id = @Emp_id, 
        @ManagerSalary = @ManagerSalary OUTPUT;

    IF @NewSalary > @ManagerSalary
        BEGIN
        RAISERROR 60000 'Salary cannot be higher than the salary of the manager!'
        ROLLBACK TRANSACTION;
        END
    ELSE
        COMMIT TRANSACTION;

Когда я обновляю зарплату до значения, превышающего зарплату менеджера, я получаю ошибку повышения + эта ошибка: транзакция завершилась в триггере. Пакет был прерван.

Когда я пытаюсь обновить зарплату до значения ниже зарплаты менеджера, я все равно получаю следующее: транзакция завершилась в триггере. Пакет был прерван.

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

Спасибо, Ryuken

PS: Это мой первый пост, может быть, я неправильно вставил код, поэтому извините.

1 Ответ

3 голосов
/ 15 июня 2011

Отключите курок.Замените его проверочным ограничением и скалярной функцией.

CREATE FUNCTION dbo.GetManagerSalary(@Emp_id int) RETURNS money
AS
BEGIN
    RETURN
        SELECT es.Salary
        FROM [dbo].[Employee] e 
        JOIN [dbo].[Employee] m ON m.Emp_id = e.Manager_id
        JOIN [dbo].[Employee_staff] es ON es.Emp_staff_code = e.Manager_id
        WHERE e.Emp_id = @Emp_id;
END

GO

ALTER TABLE Employee_staff
    ADD CONSTRAINT CK_Salary
    CHECK (ISNULL([Salary], 0) <= ISNULL(dbo.GetManagerSalary([Salary]), 1e9)))
...