Domanda

Ho due tabelle. Queste tabelle hanno due relazioni tra loro.

Table 1
   * ID_XPTO (PK)
   * Detail

Table 2
   * ID_XPTO (FK) (PK)
   * ID_XPTO2 (FK) (PK)

Queste due relazioni esistono.

Table 1 -< Table2 
Table 1 -< Table2

La mia domanda è che devo eliminare alcune righe nella tabella 1. Attualmente sto facendo

declare @table Table (xptoTable2 int)
insert into @table
        select ID_XPTO2
        from Table2 
        where ID_XPTO = @ID_XPTO

delete from Table2
where ID_XPTO = @ID_XPTO

delete from Table
where ID_XPTO in (select xptoTable2from @table)

So che potrei usare ON DELETE SET NULL su table2. In questo modo potrei quindi cercare tutte le righe con valore null su ID_XPTO2 ed eliminarle, ma DBA non vuole usarlo.

Esiste una soluzione migliore per eseguire questo processo?

È stato utile?

Soluzione

Hai queste opzioni:

  • Elimina in due istruzioni, come stai facendo ora. Elimina prima da Table2.

  • Elimina da due tabelle in un'unica istruzione, se il tuo marchio di database supporta la sintassi multi-tabella DELETE (ad esempio MySQL). Questo non è SQL standard, ma è utile.

  • Usa vincoli di integrità referenziale a cascata (capisco che il tuo DBA ha annullato questa opzione).

  • Scrivi un trigger BEFORE DELETE su Tabella1, per eliminare o impostare NULL qualsiasi riferimento in Tabella2. Verificare con il proprio DBA per vedere se questo è più accettabile dei vincoli RI a cascata.

Infine, consiglierei di parlare con il tuo DBA e di porre la stessa domanda che hai posto qui. Scopri quale soluzione preferisce utilizzare. Le persone su StackOverflow possono rispondere a domande tecniche, ma sembra che tu abbia a che fare con una domanda sui criteri IT .

Altri suggerimenti

Usa ON DELETE CASCADE. elimina automaticamente le righe di riferimento.

Perché non usi ON DELETE CASCASE?

DROP TABLE t_f
DROP TABLE t_m
CREATE TABLE t_m (id INT NOT NULL IDENTITY PRIMARY KEY , value VARCHAR(50))
CREATE TABLE t_f (id INT NOT NULL IDENTITY PRIMARY KEY, m INT, CONSTRAINT fk_m FOREIGN KEY (m) REFERENCES t_m(id) ON DELETE CASCADE)
INSERT INTO t_m (value) VALUES ('test')
INSERT INTO t_f (m) VALUES (1)
DELETE FROM t_m
SELECT * FROM t_m
SELECT * FROM t_f

id           value
------------ ------
0 rows selected

id           m
------------ ------
0 rows selected

Due metodi che conosco:

  1. Puoi usare ON DELETE CASCADE

  2. Scrivi il tuo SQL per ripulire dopo se stesso cioè:

     DECLARE @DetailCriteria ...
    
     SET @DetailCriteria = '....'
    
     BEGIN TRAN
     -- First clear the Table2 of any child records
        DELETE FROM Table2 
        WHERE 
          ID_XPTO IN (SELECT ID_XPTO FROM Table1 WHERE Detail = @DetailCriteria)
          OR ID_XPTO2 IN (SELECT ID_XPTO FROM Table1 WHERE Detail = @DetailCriteria)
    
     -- Next clear Table2 (which will delete fine because you've followed the referential chain)
        DELETE FROM Table1 WHERE Detail = @DetailCriteria
    
     -- commit if you're happy (should check @@ERROR first)
     COMMIT
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top