Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在触发器中使用其他表中的值_Sql Server_Database_Tsql - Fatal编程技术网

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