2017-11-03 11 views
0

'DETALLES'テーブルから行を削除できるトリガーを作成したいと思います。 「テーブルから行を削除して2つのテーブルを更新するトリガーを作成するには

1

そして、この第二のテーブルと呼ばれることをした後、例えば、私は、このテーブルから行を削除する:それはこのようなものだ「BOLETAS」と呼ばれる別のテーブルや別のいわゆる「ARTICULOS」、最初のテーブルを変更しますARTICULOS ":

3

2

があるため、「BOLETAS」と呼ばれるテーブル「DETALLES」列「CANTIDAD」、そして最後にテーブルから削除された行の回収された量で、彼の「STOCK」を更新する必要がありますテーブル「DETALLES」列「IMPORTE」から削除された量より少ない「TOTAL」列を更新しなければならない。

基本的に、「DETALLES」テーブルから行を削除し、別の2つのテーブルを更新できるトリガーが必要です。

たとえば、「DETALLES」から2番目の行を削除することにしたので、「CANTIDAD」列と「BOLETAS」表のため、「ART002」の「ARTICUS」列「STOCK」はプラス1でなければなりません「60」以下であること。 私の悪い英語のため申し訳ありませんが、私は時間のためにそれを試みたが、私はできません:( ものは、私はテーブルを作成するために使用されるコードです。

CREATE TABLE ARTICULOS(
CODART VARCHAR(6) PRIMARY KEY, 
NOMART VARCHAR(50), 
STOCK INT, 
PRECIO NUMERIC(8,2)) 

CREATE TABLE INGRESOS(
CODART VARCHAR(6) , 
FECHA DATE, 
CANTIDAD INT, 
PRECIO NUMERIC(8,2), 
CONSTRAINT FK1 FOREIGN KEY (CODART) REFERENCES ARTICULOS 
) 

CREATE TABLE 
CLIENTES(
CODCLI VARCHAR(6) PRIMARY KEY, 
NOMCLI VARCHAR(50), 
RUCCLI INT, 
DIRECCION VARCHAR(50) 
DEFAULT 'DESCONOCIDA' 
) 

CREATE TABLE BOLETAS(
NROBOL VARCHAR(10) PRIMARY KEY NONCLUSTERED, 
CODCLI VARCHAR(6), 
FECHA DATE, 
TOTAL NUMERIC(8,2), 
CONSTRAINT 
FK2 FOREIGN KEY (CODCLI) REFERENCES CLIENTES 
) 

CREATE TABLE DETALLES(
NROBOL VARCHAR(10) , 
CODART VARCHAR(6), 
CANTIDAD INT, 
IMPORTE NUMERIC(8,2), 
PRIMARY KEY NONCLUSTERED (NROBOL,CODART), 
CONSTRAINT FK3 FOREIGN 
KEY (NROBOL) REFERENCES 
BOLETAS, 
CONSTRAINT FK4 FOREIGN KEY (CODART) REFERENCES ARTICULOS) 
+1

トリガと手続き型のコードです**性の高いベンダー固有** - そう 'postgresql'、' SQL-server'、 'oracle'か、あなたは' mysql'を使用しているかどうかを指定するためにタグを追加してください'db2' - あるいは全く別のもの。 –

答えて

0

私はあなたのテーブルとサンプルデータで遊んだ。私が行ったテストから、削除された行は1行だけ削除され、複数の行は削除された状態でのみ動作します。検証するにはさらにテストを行う必要がありますが、これは記述したデータとロジックでうまくいくと思います。

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TRIGGER [dbo].[rowUpdater] 
    ON [dbo].[DETALLES] 
    AFTER DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    UPDATE ARTICULOS 
    SET STOCK = a.STOCK + d.STOCK 
    FROM ARTICULOS a 
     JOIN (SELECT d.CODART,SUM(d.CANTIDAD) 'STOCK' 
       FROM deleted d 
       GROUP BY d.CODART) AS d ON a.CODART = d.CODART 

    UPDATE BOLETAS 
    SET TOTAL = b.TOTAL - d.TOTAL 
    FROM BOLETAS b 
     JOIN (SELECT d.NROBOL,SUM(d.IMPORTE) 'TOTAL' 
       FROM deleted d 
       GROUP BY d.NROBOL) AS d ON b.NROBOL = d.NROBOL 
END 
GO 

ALTER TABLE [dbo].[DETALLES] ENABLE TRIGGER [rowUpdater] 
GO 
+0

ありがとう、私は後でそれをテストします、今はできません。これが意図どおりに機能するかどうか、私はあなたに伝えます、ありがとう! –

+0

ええと、これは答えです。ありがとうございました:D! –

関連する問題