163 messaggi dal 09 aprile 2009
Ciao a tutti,
chiamo da aspnet la seguente Stored Procedure che dovrebbe eliminare a cascata 2 record da due differenti tabelle:

ALTER PROCEDURE [dbo].[DeleteLinguaTipologia]
(
@idtipologia int,
@tipologia int


) AS
SET XACT_ABORT ON



BEGIN Transaction
--BEGIN TRY

-- STEP 2 & 3: Issue the DELETE statements, checking @@ERROR after each statement
DELETE FROM tipologie_lingue
WHERE id = @idtipologia
DELETE FROM tipologie
WHERE id = @tipologia
IF @@ERROR = 0
COMMIT TRANSACTION
ELSE
ROLLBACK TRANSACTION


Il problema è che il delete lo fà solo sulla prima tabella.( lo stesso comportamento si ha anche se eseguo direttamente la sp da SqlServer)
essendoci una transazione come mai fà il delete solo su una tabella invece di bloccarsi per rilevare l'errore?
Dove sbaglio?

grazie
Modificato da seventh_seal il 03 aprile 2013 10.43 -

Saluti
The Seventh Seal
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
non mi e' molto chiaro "cosa intendi fare"....
parto dal presupposto che tu voglia fare una cosa simile,
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.tipologie (
  Id int NOT NULL PRIMARY KEY
  );
CREATE TABLE dbo.tipologia_lingue (
  IdLingua int NOT NULL, 
  Id int NOT NULL 
    CONSTRAINT fk_tipologia_lingue$is$tipologia FOREIGN KEY
      REFERENCES dbo.tipologie(Id)
  );
GO
INSERT INTO dbo.tipologie 
  VALUES (1), (2), (3);
INSERT INTO dbo.tipologia_lingue
  VALUES (1, 1),
      (2, 1), (2, 2),
      (3, 1), (3, 2), (3, 3);
GO
CREATE PROCEDURE dbo.usp (
  @id int 
  )
AS BEGIN

  SET XACT_ABORT ON
  BEGIN TRANSACTION;
  BEGIN TRY
    DELETE dbo.tipologie 
      WHERE Id = @id;
    IF (@@ERROR = 0)
      DELETE tipologia_lingue
        WHERE Id = @id;

    COMMIT;
  END TRY

  BEGIN CATCH
    ROLLBACK;
    -- ritorna l'errore
    DECLARE @ErrorMSG varchar(2000);
    SET @ErrorMSG = ERROR_MESSAGE();
    RAISERROR (@ErrorMSG, 16, 1);
    RETURN -100;
  END CATCH

END;
GO
EXEC dbo.usp 5;
GO
EXEC dbo.usp 1;
SELECT *
  FROM dbo.tipologia_lingue
  WHERE Id = 1;
SELECT * 
  FROM dbo.tipologie
  WHERE Id = 1;
GO
DROP PROCEDURE dbo.usp;
DROP TABLE dbo.tipologia_lingue, dbo.tipologie;
--<----------
Msg 50000, Level 16, State 1, Procedure usp, Line 23
The DELETE statement conflicted with the REFERENCE constraint "fk_tipologia_lingue$is$tipologia". The conflict occurred in database "tempdb", table "dbo.tipologia_lingue", column 'Id'.
IdLingua    Id
----------- -----------
1           1
2           1
3           1

Id
-----------
1


innanzitutto rimetterei in linea il blocco di trattamento delle eccezioni BEGIN TRY/BEGIN CATCH...
per il resto, non riesco bene a capire, in quanto se ti aspetti problematiche relative alla cancellazione "a catena", ovviamente si dovrebbe invertire a priori l'ordine di eliminazione, quindi prima la tabella referenziate e poi la referenziata...
puoi farmi capire meglio?
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.