Sql server 在触发器中使用其他表中的值
我对触发器还不熟悉,所以我不太了解触发器。但我要做的是编写一个触发器,检查员工的工资是否等于或高于该特定职能部门的工资 我现在的触发器如下所示:Sql server 在触发器中使用其他表中的值,sql-server,database,tsql,Sql Server,Database,Tsql,我对触发器还不熟悉,所以我不太了解触发器。但我要做的是编写一个触发器,检查员工的工资是否等于或高于该特定职能部门的工资 我现在的触发器如下所示: CREATE TRIGGER Salary_check ON Employee AFTER INSERT,UPDATE AS DECLARE @function_id INT DECLARE @salaris MONEY DECLARE @function_salary MONEY @function_id = S
CREATE TRIGGER Salary_check
ON Employee
AFTER INSERT,UPDATE
AS
DECLARE @function_id INT
DECLARE @salaris MONEY
DECLARE @function_salary MONEY
@function_id = SELECT function_id from INSERTED
@salaris = SELECT salary
FROM Employee
WHERE emp_id = (SELECT emp_id from INSERTED)
@function_salary = SELECT salary
FROM Function
WHERE id = @function_id
IF @salaris < @function_salary
BEGIN
RAISERROR(‘Salary of an employee should be equal or higher to the required salary of the specific function. ’);
ROLLBACK TRANSACTION;
END;
GO
我想知道我的@function\u salary是否为有效值。因为我从函数表而不是员工表中检索它?function_id是引用表function id的外键。触发器中存在多个语法和逻辑问题。我建议您查看文档中的触发器示例 触发器应该更像这样:
CREATE TRIGGER Salary_check ON Employee AFTER INSERT, UPDATE
AS BEGIN
IF (EXISTS (SELECT 1
FROM inserted i JOIN
function f
ON f.function_id = i.function_id
WHERE i.salary < f.salary OR i.salary IS NULL
)
)
BEGIN
RAISERROR('Salary of an employee should be equal or higher to the required salary of the specific function.');
ROLLBACK TRANSACTION;
END;
END; -- trigger
GO
触发器中存在多个语法和逻辑问题。我建议您查看文档中的触发器示例 触发器应该更像这样:
CREATE TRIGGER Salary_check ON Employee AFTER INSERT, UPDATE
AS BEGIN
IF (EXISTS (SELECT 1
FROM inserted i JOIN
function f
ON f.function_id = i.function_id
WHERE i.salary < f.salary OR i.salary IS NULL
)
)
BEGIN
RAISERROR('Salary of an employee should be equal or higher to the required salary of the specific function.');
ROLLBACK TRANSACTION;
END;
END; -- trigger
GO
旁注:触发器有一个主要缺陷,因为它假设每次只插入或更新一条记录。这是错误的,因为TSQL中的DML触发器是按语句而不是按行激发的。这意味着,如果insert或update语句将影响多行,则插入和删除的伪表中将有多行,并且触发器将失败。@zoharPeled谢谢!旁注:触发器有一个主要缺陷,因为它假设每次只插入或更新一条记录。这是错误的,因为TSQL中的DML触发器是按语句而不是按行激发的。这意味着,如果insert或update语句将影响多行,则插入和删除的伪表中将有多行,并且触发器将失败。@zoharPeled谢谢!我想在洗牌的时候比较起来有点混乱。当检查个人薪资是否违反职务职能的同等或更高规则时,应为i.salary