Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 2008 SQL Server 2008触发器不工作,为什么?_Sql Server 2008_Tsql_Triggers - Fatal编程技术网

Sql server 2008 SQL Server 2008触发器不工作,为什么?

Sql server 2008 SQL Server 2008触发器不工作,为什么?,sql-server-2008,tsql,triggers,Sql Server 2008,Tsql,Triggers,我有一个名为tblReservations的表,表中有以下列: reserv_ID (int), aptID (int), client_ID (int), start_date (datetime), end_date (datetime), details (nvarchar(max)), confirmation (bit) 触发器应该是在tblReservation中针对特定aptID比较新预订的开始日期和现有预订的结束日期 如果开始日期

我有一个名为tblReservations的表,表中有以下列:

reserv_ID (int), aptID (int), client_ID (int), 
start_date (datetime), end_date (datetime), 
details (nvarchar(max)), confirmation (bit)
触发器应该是在tblReservation中针对特定aptID比较新预订的开始日期和现有预订的结束日期

如果开始日期<结束日期,则触发器必须阻止插入该aptID的新预订

我写了这个触发器:

CREATE TRIGGER NewReservation
    on tblReservations
    after insert
    as
    begin
        declare @aptID int
        declare @start_date datetime
        declare @end_date datetime

        select @aptID=aptID, @start_date=start_date from inserted
        select @end_date=end_date from tblReservations
        where aptID=@aptID

        if @end_date>@start_date
        BEGIN
            ROLLBACK TRANSACTION
        END
    end  
为什么这个触发器不起作用


请帮助

我看到的第一个问题是您假设插入的是一行

尝试:


但是,您应该考虑更改逻辑,以便在日期错误的情况下,不会在第一个位置插入记录。

我看到的第一个问题是您假设插入的是一行

尝试:


但是,您应该考虑更改逻辑,以便在日期错误的情况下永远不会插入记录。

除了其他人提出的多行或多行问题之外,您可能没有考虑到特定apt id的TBLR保留中有许多行

另外,您不希望插入该记录然后将其删除,您希望该记录不会进入。因此,用触发器代替触发器是更好的选择

CREATE TRIGGER NewReservation
    ON tblReservations
    INSTEAD OF INSERT
    AS
    BEGIN

        INSERT tblReservations (<put field list here>)
        SELECT <put field list here>
        FROM inserted i
        JOIN (SELECT aptid, MAX(reservationid)AS reservationid FROM tblReservations GROUP BY aptid)  maxid 
            ON i.aptid = r.aptid
        JOIN    tblReservations r 
            ON r.reservationid = maxid.reservationid
        WHERE r.enddate<i.startdate


    END  

除了其他人提出的multiorw问题外,您可能没有考虑到对于特定的apt id,tblreservation中有许多行

另外,您不希望插入该记录然后将其删除,您希望该记录不会进入。因此,用触发器代替触发器是更好的选择

CREATE TRIGGER NewReservation
    ON tblReservations
    INSTEAD OF INSERT
    AS
    BEGIN

        INSERT tblReservations (<put field list here>)
        SELECT <put field list here>
        FROM inserted i
        JOIN (SELECT aptid, MAX(reservationid)AS reservationid FROM tblReservations GROUP BY aptid)  maxid 
            ON i.aptid = r.aptid
        JOIN    tblReservations r 
            ON r.reservationid = maxid.reservationid
        WHERE r.enddate<i.startdate


    END  

+1完全正确-触发器可能会为多行插入调用一次,因此插入将包含多行…这对于多行插入仍然无法正常工作。如果从触发器中插入的变量分配给标量变量,它可能会被破坏。+1确切地说-一个触发器可能会被多次插入调用一次,因此插入的变量将包含多行…这对于多行插入仍然无法正常工作。如果从插入的触发器中为标量变量赋值,它可能已损坏。您不能仅使用检查约束检查开始日期将插入或删除的值设置为标量变量的任何触发器wirten都是错误的。它将无法正确处理多行插入、更新或删除。您永远不能假设这些不会发生。除了多行问题之外,您可能没有考虑到特定apt id的tblReservations中有许多行。您不能只使用检查约束检查开始日期将值从inserted或deleted设置为标量变量的任何触发器wirtten都是错误的。它将无法正确处理多行插入、更新或删除。您永远不能假设这些不会发生。除了多行问题之外,您可能没有考虑到特定apt id的TBLReservation中有许多行。好的,但现在我得到了这个错误:Msg 4104,级别16,状态1,过程NewReservation,第15行无法绑定多部分标识符r.apid。这是因为我在编写别名时更改了别名,并且错过了引用。r、 aptid应该是maxid.aptidok,但现在我得到了这个错误:Msg 4104,级别16,状态1,过程NewReservation,第15行多部分标识符r.aptid无法绑定。这是因为我在编写别名时更改了别名,错过了引用。r、 aptid应该是maxid.aptid