1

基本上,我试图比较用户将输入的日期,如果它大于今天的日期(GETDATE()),那么它会抛出错误并且不输入数据。查询会引发错误,但它仍会输入数据,结果位于底部。

USE EMR
GO

IF EXISTS (SELECT DB_ID('CheckDate'))
    DROP TRIGGER CheckDate
    GO

CREATE TRIGGER CheckDate
ON VISIT
AFTER INSERT, UPDATE
AS
BEGIN TRAN
    DECLARE @ErrorMessage VARCHAR(200)
    DECLARE @Date VARCHAR(20) = CAST ((SELECT CONVERT (DATE, GETDATE())) AS VARCHAR(20))
    SET @ErrorMessage = 'Date Must Be On Or Before ' + @Date + '';

    DECLARE @CheckDate DATE = (SELECT Date_Of_Service FROM inserted);

    IF CAST((@CheckDate) AS DATE) <= CAST(GETDATE() AS DATE)
        COMMIT TRAN

    ELSE
        RAISERROR(@ErrorMessage, 1, 1)

这是我的插入语句:

INSERT INTO VISIT (PK_VISIT_ID, Date_Of_Service)
VALUES (02913, '2018-12-03')

得到这个:

Date Must Be On Or Before 2016-02-17
Msg 50000, Level 1, State 1

(1 row(s) affected)
4

2 回答 2

1

您使用severity= 1 引发错误,这意味着服务器它只是info message

查看对这篇文章的回复:TSQL:防止触发器抑制错误但回滚事务
还有一个链接到 msdn 上的严重性表。

于 2016-02-18T05:49:03.007 回答
0

即使在 raiserror 之后,您的代码也会执行插入操作,因为 insert 触发器会在插入行后运行触发器。您可以使用检查约束或代替 insert,如下所示:

alter trigger tr2 on bb
instead of insert
as
begin
    begin try
        begin transaction
            if exists(select * from inserted where date1  > getdate())
                    begin
                        raiserror('date greater then today''s date',16,1)
                    end

                else
                    begin
                        insert into bb
                        select * from inserted
                        if @@trancount > 0
                        commit transaction
                    end
    end try

    begin catch
        declare @msg varchar(100) = error_message()
            if @@trancount > 0
                begin
                    raiserror(@msg,16,1)
                    rollback transaction
                end         
    end catch
end
于 2016-02-21T09:27:57.783 回答