2016-04-06 11 views
-1

Bir veritabanı sınıfı alıyorum ve bu konuda tamamen kayboldum. Umarım bana yardım edebilirsin. İşte ders kitabımıza dayanarak oluşturduğum SQL tetikleyicisi. Örneklerin SQL Server 2012 tabanlı olduğunu, ancak tetiği test ettiğimde bazı sözdizimlerini tanıyamayacağını söylüyor. Bunu farklı şekilde yapmanın bir yolu var mı? SHIPMENT_ITEM, SHIPMENT'un bir alt öğesi ve bir M-M relationship. Teşekkür :)Tetikleyici Oluşturma [table] MS SQL Server'da Silme

tetikleyicinize t-sql sözdizimi uymuyor birkaç şey vardır
CREATE TRIGGER SHIPMENT_ITEM_SHIPMENT_DeleteCheck 
ON [dbo].[DeleteShipmentItemView] 
FOR DELETE 

DECLARE 
rowCount  Int; 

BEGIN 
/* to determine if shipment item is last one in shipment */ 
SELECT Count (*) into rowCount 
FROM [dbo].[SHIPMENT_ITEM] 
WHERE [dbo].[SHIPMENT_ITEM].[ShipmentID] = old:[ShipmentID]; 

/*delte shipment item row regardless of wheter shipment is deleted */ 
DELETE [dbo].[SHIPMENT_ITEM] 
WHERE [dbo].[SHIPMENT_ITEM].[ShipmentID] = old:[ShipmentID]; 

IF (rowCount = 1) 
THEN 
    /*last shipment item in shipment, delete shipment */ 
    DELETE [dbo].[SHIPMENT] 
    WHERE [dbo].[SHIPMENT].[ShipmentID] = old:[ShipmentID]; 

END IF; 

END; 

Level 15, State 1, 
Procedure SHIPMENT_ITEM_SHIPMENT_DeleteCheck, Line 5 Incorrect syntax near the keyword 'SET'. 

Procedure SHIPMENT_ITEM_SHIPMENT_DeleteCheck, Line 10 Incorrect syntax near the keyword 'rowCount'. 

Procedure SHIPMENT_ITEM_SHIPMENT_DeleteCheck, Line 16 Incorrect syntax near 'old:'. 

Procedure SHIPMENT_ITEM_SHIPMENT_DeleteCheck, Line 16 The label 'old' has already been declared. Label names must be unique within a query batch or stored procedure. 

Procedure SHIPMENT_ITEM_SHIPMENT_DeleteCheck, Line 22 Incorrect syntax near 'old:'. 

Procedure SHIPMENT_ITEM_SHIPMENT_DeleteCheck, Line 22 The label 'old' has already been declared. Label names must be unique within a query batch or stored procedure. 
+2

sözdizimi eski: [ShipmentId] doğru değil – FLICKER

+0

değil t/sql yerine pl/sql? –

cevap

1

. t-sql

  1. DECLARE rowCount Int;
    Değişkenler bir @ işareti ile başlamalıdır.
    doğru sözdizimi DECLARE @rowCount Int; T-SQL

  2. SELECT Count (*) into rowCount
    , Select into yeni bir tablo oluşturur olacaktır. Muhtemelen bunun yerine SELECT @rowCount = Count (*) olmasını istiyorsunuz.

  3. [dbo].[SHIPMENT_ITEM].[ShipmentID] = old:[ShipmentID];
    Aslında bu çizgide başarmak istediğiniz emin değilim, ama bu t-sql değil. Sanırım silinmiş satır sayısını elde etmek istiyorsun. Bu durumda, SELECT COUNT(*) FROM deleted.

Ben Tetikleyicinizi anlamak yolu, amacınız bunun için SHIPMENT_ITEM tabloda hiçbir karşılık gelen kayıt varsa SHIPMENT tablodaki bir kaydı silmek etmektir.

muhtemelen böyle bir şey yapacağını:

CREATE TRIGGER SHIPMENT_ITEM_SHIPMENT_DeleteCheck 
ON dbo.SHIPMENT_ITEM 
FOR DELETE 

AS 
    DELETE 
    FROM dbo.SHIPMENT s 
    WHERE EXISTS (
     SELECT 1 
     FROM deleted d 
     WHERE d.ShipmentID = s.ShipmentID 
    ) 
    AND NOT EXISTS(
     SELECT 1 
     FROM dbo.SHIPMENT_ITEM si 
     WHERE si.ShipmentID = s.ShipmentID 
    ) 
GO 

Notlar:

  • Bu tetikleyici hem exists ve not exists alt sorgu ile bir yerde maddesi de var. Bu, yalnızca sevkedilen shipment_item öğesine karşılık gelen gönderi kayıtlarını silmenizi ve yalnızca aynı shipmnet kimliğine sahip başka shipment_item kayıtları olmadığından emin olmanızı sağlar.
  • Sorudaki tetikleyici bir görünüm içindir, bu tablo için geçerlidir. sql sunucusundaki tüm görünümlerin güncellenemediğini, dolayısıyla doğrudan shipment_item tablosunda değil, doğrudan görüntüleme üzerinde tetikleyici oluşturmanız gerekebileceğini unutmayın. Ayrıca MSDN'deki Create trigger sayfasını kontrol Daha fazla bilgi için sql server

bir görünüm üzerinde tetikleyiciler sonra kullanmak unutmayın.

+0

Yardımlarınız için çok teşekkür ederim. – NBC

+0

[Yardım için: -)] (http://meta.stackoverflow.com/questions/291325/how-to-show-appreciation-to-a-user-on-stackoverflow/291327#291327) –