Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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 2005 如何使用触发器将记录插入多个表?_Sql Server 2005 - Fatal编程技术网

Sql server 2005 如何使用触发器将记录插入多个表?

Sql server 2005 如何使用触发器将记录插入多个表?,sql-server-2005,Sql Server 2005,我有两张桌子 我想同时在两个表上插入相同的记录。 也就是说,当我为第一个表插入一条记录时,同样的记录也会使用触发器插入到第二个表中 您在这个过程中有经验/建议吗?如果您使用的是存储过程,您可以轻松地管理它 CREATE PROCEDURE sp_Insert @Value varchar(10) AS insert into table1 (...,...) values (@value,...) insert into table2 (...,...) values (@value,...)

我有两张桌子

我想同时在两个表上插入相同的记录。 也就是说,当我为第一个表插入一条记录时,同样的记录也会使用触发器插入到第二个表中


您在这个过程中有经验/建议吗?

如果您使用的是存储过程,您可以轻松地管理它

CREATE PROCEDURE sp_Insert
@Value varchar(10)
AS
insert into table1 (...,...) values (@value,...)
insert into table2 (...,...) values (@value,...)

如果您使用的是存储过程,则可以轻松地管理它

CREATE PROCEDURE sp_Insert
@Value varchar(10)
AS
insert into table1 (...,...) values (@value,...)
insert into table2 (...,...) values (@value,...)

我建议在触发器上使用Erik的方法。触发器往往会导致性能问题,而且很多时候,您忘记了触发器的存在,并得到意外的行为。但是,如果您确实想使用触发器,它将起作用。以下是一个例子:

CREATE TRIGGER trgTest ON Test
FOR INSERT
AS
INSERT Test2
     (Id, value)
SELECT Id, Value 
FROM Inserted

我建议在触发器上使用Erik的方法。触发器往往会导致性能问题,而且很多时候,您忘记了触发器的存在,并得到意外的行为。但是,如果您确实想使用触发器,它将起作用。以下是一个例子:

CREATE TRIGGER trgTest ON Test
FOR INSERT
AS
INSERT Test2
     (Id, value)
SELECT Id, Value 
FROM Inserted

可以使用光标概念

CREATE OR REPLACE TRIGGER bi_order
BEFORE INSERT
ON ord
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
WHEN (NEW.payment_type = 'CREDIT')
DECLARE
CURSOR cur_check_customer IS
   SELECT 'x'
   FROM   customer
   WHERE  customer_id = :NEW.customer_id
   AND    credit_rating = 'POOR';
lv_temp_txt          VARCHAR2(1);
lv_poor_credit_excep EXCEPTION;
BEGIN
OPEN cur_check_customer;
FETCH cur_check_customer INTO lv_temp_txt;
IF (cur_check_customer%FOUND) THEN
   CLOSE cur_check_customer;
   RAISE lv_poor_credit_excep;
ELSE
   CLOSE cur_check_customer;
END IF;
EXCEPTION
WHEN lv_poor_credit_excep THEN
   RAISE_APPLICATION_ERROR(-20111, 'Cannot process CREDIT ' ||
      'order for a customer with a POOR credit rating.');
WHEN OTHERS THEN
   RAISE_APPLICATION_ERROR(-20122, 'Unhandled error occurred in' ||
      ' BI_ORDER trigger for order#:' || TO_CHAR(:NEW.ORDER_ID));
END bi_order;

可以使用光标概念

CREATE OR REPLACE TRIGGER bi_order
BEFORE INSERT
ON ord
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
WHEN (NEW.payment_type = 'CREDIT')
DECLARE
CURSOR cur_check_customer IS
   SELECT 'x'
   FROM   customer
   WHERE  customer_id = :NEW.customer_id
   AND    credit_rating = 'POOR';
lv_temp_txt          VARCHAR2(1);
lv_poor_credit_excep EXCEPTION;
BEGIN
OPEN cur_check_customer;
FETCH cur_check_customer INTO lv_temp_txt;
IF (cur_check_customer%FOUND) THEN
   CLOSE cur_check_customer;
   RAISE lv_poor_credit_excep;
ELSE
   CLOSE cur_check_customer;
END IF;
EXCEPTION
WHEN lv_poor_credit_excep THEN
   RAISE_APPLICATION_ERROR(-20111, 'Cannot process CREDIT ' ||
      'order for a customer with a POOR credit rating.');
WHEN OTHERS THEN
   RAISE_APPLICATION_ERROR(-20122, 'Unhandled error occurred in' ||
      ' BI_ORDER trigger for order#:' || TO_CHAR(:NEW.ORDER_ID));
END bi_order;

如何开始将记录插入原始表?如何开始将记录插入原始表?这是在一个SP中处理记录的简单方法,可读性更高,易于调试。触发器可以是一个关键的设置,因为一旦设置完毕,您可能会忘记它们的存在,并且无法理解数据为什么会发生变化;我不知道您的环境是什么,但是如果您在VS中使用C,请看一下本教程。它是关于在C中使用ADO.Net和存储过程的。这是在一个SP中处理它的简单方法,可读性更高,调试也更容易。触发器可以是一个关键的设置,因为一旦设置完毕,您可能会忘记它们的存在,并且无法理解数据为什么会发生变化;我不知道您的环境是什么,但是如果您在VS中使用C,请看一下本教程。它是关于在C中使用ADO.Net和存储过程的。