Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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/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 SQL Server触发器(插入前)以验证数据?_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server SQL Server触发器(插入前)以验证数据?

Sql server SQL Server触发器(插入前)以验证数据?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我们在仓库中使用一个应用程序来跟踪哪些拣选者正在拣选哪些订单。我们经常有一个实例,插入到表中的订单号不是实际的订单号。虽然我们将对应用程序进行一些验证,但我想知道如何在表上设置触发器,以防止在订单号错误时写入记录 例如: 在插入之前,当lenordernum“6”时,然后删除记录。 否则,请插入表1 ?您可以创建替代触发器: -在表上创建一个INSERT而非INSERT触发器: CREATE TRIGGER InsteadTrigger on dbo.table1 INSTEAD OF INSE

我们在仓库中使用一个应用程序来跟踪哪些拣选者正在拣选哪些订单。我们经常有一个实例,插入到表中的订单号不是实际的订单号。虽然我们将对应用程序进行一些验证,但我想知道如何在表上设置触发器,以防止在订单号错误时写入记录

例如:

在插入之前,当lenordernum“6”时,然后删除记录。 否则,请插入表1

您可以创建替代触发器:

-在表上创建一个INSERT而非INSERT触发器:

CREATE TRIGGER InsteadTrigger on dbo.table1
INSTEAD OF INSERT
AS
BEGIN
  if  len(inserted.ordernum)= 6
     insert into table1 (ordernum,col1, col2) values (inserted.ordernum,inserted.col1, inserted.col2)
--rows that dont have a ordernum length of 6 are not inserted

end

而非触发器会导致其源DML操作跳过,并且只执行其中提供的代码。实际的插入、删除或更新操作根本不会发生。但是,它们有关联的插入表和删除表,模拟DML操作。插入表和删除表广泛用于触发器内部的操作

    --Instead of Trigger
    CREATE TRIGGER BeforeDelete_Trigger ON [dbo].[Order1]
    INSTEAD OF INSERT AS
    BEGIN
     IF (SELECT * FROM Order1 WHERE len(ordernum) <> '6')
     THEN 
    INSERT INTO Order1;
   ELSE
    INSERT INTO Order2 (col 1, col 2) VALUES (inserted.col1, inserted.col2);
     END;
     GO

SQL Server没有任何插入前触发器。您可以使用INSTEAD而不是INSERT触发器,或者重新考虑您的逻辑,看看是否可以使用AFTER INSERT来处理它trigger@marc_s你不能从后插入触发器中取消事务,使其成为有效的前插入吗?@nicomp:是的,这是唯一的出路-如果在插入后触发器中检测到无效的内容,您可以取消正在运行的事务,该事务实际上触发了trigger@marc_s我认为这是一个很好的解决方法,因为此时您有代理键,但您仍然与数据库的其余部分隔离。一个**检查**约束可以很容易地防止这种情况,而且创建起来很简单。此外,这是否是缺乏引用完整性的情况?似乎这样的列应该是订单表的外键。MSMS的行为就像它不理解作为标识符插入一样。@MattC它不起作用,语法不正确。如果没有FROM子句,则无法插入引用。此外,应答者的逻辑是将insert视为只包含一行。我不会按照目前的指导去做。