Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 使用Inserted时,“插入后”触发器不起作用_Sql Server_Tsql_Triggers - Fatal编程技术网

Sql server 使用Inserted时,“插入后”触发器不起作用

Sql server 使用Inserted时,“插入后”触发器不起作用,sql-server,tsql,triggers,Sql Server,Tsql,Triggers,我试图在Employees表中写入一个触发器,该触发器不允许插入一个新员工,该新员工的雇佣日期早于其上司的雇佣日期 CREATE TABLE [dbo].[Employees] ( [EID] [int] IDENTITY(1,1) NOT NULL, [Ename] [nvarchar](20) NOT NULL, [Gender] [nvarchar](1) NOT NULL, [IsMarried] [nvarchar](1) NOT NULL, [

我试图在Employees表中写入一个触发器,该触发器不允许插入一个新员工,该新员工的雇佣日期早于其上司的雇佣日期

CREATE TABLE [dbo].[Employees]
(
    [EID] [int] IDENTITY(1,1) NOT NULL,
    [Ename] [nvarchar](20) NOT NULL,
    [Gender] [nvarchar](1) NOT NULL,
    [IsMarried] [nvarchar](1) NOT NULL,
    [Birthdate] [date] NOT NULL,
    [HireDate] [date] NOT NULL,
    [Salary] [float] NOT NULL,
    [Notes] [nvarchar](200) NULL,
    [NationalityID] [int] NULL,
    [BossID] [int] NULL,

    CONSTRAINT [PK_Employees] 
        PRIMARY KEY CLUSTERED ()
)
这是触发代码:

CREATE TRIGGER [dbo].[Trig_04]
ON [dbo].[Employees]
AFTER INSERT
AS 
BEGIN
    IF ((SELECT INSERTED.HireDate FROM INSERTED WHERE BossID <> EID) < 
        (SELECT Employees.HireDate FROM Employees 
         WHERE EID IN (SELECT Employees.BossID FROM Employees WHERE BossID <> EID)))
        ROLLBACK
END

它正常执行时没有错误,但不工作,但是当我在子查询中使用employees表而不是插入的表时,它工作正常。有人对此有答案吗?

您必须在SQL Server中编写触发器,以处理插入的数据可能包含多条记录这一事实。你不能假设它只是一条记录。我认为以下是您正在寻找的:

if exists (
  select 1
  from Inserted I
  where I.BossID <> I.EID
  and I.HireDate < (select E.HireDate from Employees E where E.EID = I.BossID)
) begin
    ROLLBACK;
end

您必须在SQL Server中编写触发器来处理插入的数据可能包含多条记录的事实。你不能假设它只是一条记录。我认为以下是您正在寻找的:

if exists (
  select 1
  from Inserted I
  where I.BossID <> I.EID
  and I.HireDate < (select E.HireDate from Employees E where E.EID = I.BossID)
) begin
    ROLLBACK;
end

@萨拉西布利尼-这有帮助吗?@萨拉西布利尼-这有帮助吗?