Silmeyi gerçekleştirmeden bir DELETE değerinin bir kısıtlama ihlaline girip girmeyeceğini tahmin edebilmek istiyorum.
Bunu yapmak için seçeneklerim nelerdir? SİLME "kuru çalışma" yapmanın basit bir yolu var mı?
Silmeyi gerçekleştirmeden bir DELETE değerinin bir kısıtlama ihlaline girip girmeyeceğini tahmin edebilmek istiyorum.
Bunu yapmak için seçeneklerim nelerdir? SİLME "kuru çalışma" yapmanın basit bir yolu var mı?
Yanıtlar:
Hedefiniz tüm silme işlemlerini yalnızca hepsi başarılı olursa işlemekse, neden sadece TRY / CATCH kullanmıyorsunuz:
BEGIN TRANSACTION;
BEGIN TRY
DELETE #1;
DELETE #2;
DELETE #3;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
END CATCH
Hedef, bir veya daha fazla başarısız olsa bile tüm başarılı silme işlemlerinin başarılı olmasına izin vermekse, ayrı ayrı TRY / CATCH kullanabilirsiniz;
BEGIN TRY
DELETE #1;
END TRY
BEGIN CATCH
PRINT 1;
END CATCH
BEGIN TRY
DELETE #2;
END TRY
BEGIN CATCH
PRINT 1;
END CATCH
Seçeneklerden biri, bir işleme başlamak, silmenizi çalıştırmak ve ardından her zaman geri almaktır:
begin tran
delete Table1 where col1 = 1
-- Test whether it is there
select * from Table1 where col1 = 1
rollback tran
-- Confirm that it is still there
select * from Table1 where col1 = 1
Bir tablodaki herhangi bir öğeyi eklemek, başarısızlıkları yoksaymak için özel durumları yönetmek veya ayrıca işlem sonrası hataları durdurmak için bazı kodlarla Aaron Bertrand tarafından sağlanan çözümü geliştirmek istiyorum.
Bu kayıtlar tablodan seçilir ve istisnasız olarak silinmeye çalışır:
DECLARE @MaxErrors INT
SET @MaxErrors = 5; // Setting 0 will stop process after the first error!
SELECT
[Id]
, ROW_NUMBER() OVER (ORDER BY Id ASC) AS [Index]
INTO #DeletingItems
FROM myTable
DECLARE @Current INT, @Max INT, @Id INT, @TotErrors INT
SELECT
@Current = 1
, @TotErrors = 0
, @Max = MAX([Index])
FROM #DeletingTable
WHILE @Current <= @Max
BEGIN
SELECT
@Id = [Id]
FROM #DeletingItems
WHERE
[Index] = @Index;
BEGIN TRANSACTION;
BEGIN TRY
DELETE FROM myTable WHERE [Id] = @Id;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
SET @TotErrors = @TotErrors + 1;
IF @TotErrors > @MaxErrors
BREAK;
END CATCH
SET @Current = @Current + 1;
END