2014-07-15 107 views
0

我有以下內容:如何刪除記錄如果我可以先刪除其他記錄?

一個文件可以包含另一個文件(一個視頻文件包含音頻和字幕),並且通常不會單獨保存內容文件,只會顯示爲主文件的一部分。然而在一些特殊情況下,我將一些內容文件分開保存。

另外我有商店,所以如果是主文件,並且如果我有一個輔助文件保存在主文件的一部分中,則一個文件在商店中。

所以我有這樣的兩個表:

  • 文件(IDfile,...);
  • FilesContainsFiles(IDContainerFile,IDContentFile);
  • 百貨(IDStore,...)
  • StoresHaveFiles(IDStore,IDFile)

如果我想刪除一個主文件,我想只能從特定sotre刪除,因此,如果該文件是在其他商店中,我不想刪除該文件。如果該文件不在另一個商店中,我想刪除該文件,因爲它無法在數據庫中獲得該信息。

此外,我想要刪除所有的內容文件,僅當內容文件沒有存儲在另一個存儲單獨的主文件之外。

爲了確保我無法刪除其他商店中的文件,我不會刪除StoresHasFiles上的關聯級聯,因此通過這種方式我得到了一個外國人關鍵錯誤。

所以我想按照這個步驟:

  • 嘗試刪除主文件。如果我可以做到,請嘗試刪除內容文件。

我想我需要一個事務來做到這一點,但我不知道該怎麼做。

我不知道我是否可以聲明一個列表,其中包含我嘗試刪除的文件,如何迭代此列表以及如何嘗試刪除內容文件,以及如果某些內容文件無法刪除因爲存儲在其他地方,請嘗試刪除下一個內容文件。

也許有另外的選擇來解決這種情況?

謝謝。

回答

2

有幾種不同的方法可以做到這一點。關於交易,瞭解語法和用法的最簡單方法是在MSDN上閱讀關於Begin Transaction的信息。

對於刪除,我會做的方式是:

​​
1

我將與一系列的檢查,處理這個問題。

如果該文件存在於指定的商店..否則什麼都不做。 如果該文件存在於某個其他商店...則只需從該商店中刪除。

例:

IF OBJECT_ID('TEMPDB..#Files') IS NOT NULL DROP TABLE #Files 
IF OBJECT_ID('TEMPDB..#FilesContainsFiles') IS NOT NULL DROP TABLE #FilesContainsFiles 
IF OBJECT_ID('TEMPDB..#Stores') IS NOT NULL DROP TABLE #Stores 
IF OBJECT_ID('TEMPDB..#StoresHaveFiles') IS NOT NULL DROP TABLE #StoresHaveFiles 

CREATE TABLE #Files ([IDFile] INT IDENTITY(1,1), [FileName] VARCHAR(100)) 
CREATE TABLE #FilesContainsFiles ([IDContainerFile] INT, [IDContentFile] INT) 
CREATE TABLE #Stores ([IDStore] INT IDENTITY(1,1), [StoreName] VARCHAR(100)) 
CREATE TABLE #StoresHaveFiles ([IDStore] INT, [IDFile] INT) 

INSERT INTO #Stores (StoreName) VALUES ('Target'),('Walmart') 
INSERT INTO #Files ([FileName]) VALUES ('true.blood.mkv'), ('game.of.thrones.mkv'), ('game.of.thrones-swe.sub') 
INSERT INTO #FilesContainsFiles (IDContainerFile, IDContentFile) VALUES (2,3) 
INSERT INTO #StoresHaveFiles (IDStore, IDFile) VALUES (1,1),(1,2),(2,2) 

DECLARE @StoreToDeleteFrom VARCHAR(100), @FileToDelete VARCHAR(100) 
--SET @StoreToDeleteFrom='Target' 
SET @StoreToDeleteFrom='Walmart' 
--SET @FileToDelete='true.blood.mkv' 
SET @FileToDelete='game.of.thrones.mkv' 

SELECT * 
FROM #Files F 
LEFT OUTER JOIN #FilesContainsFiles FParent ON F.IDFile=FParent.IDContainerFile 
LEFT OUTER JOIN #StoresHaveFiles SHF ON F.IDFile=SHF.IDFile 
LEFT OUTER JOIN #Stores S ON SHF.IDStore=S.IDStore 

-- IF THE FILE IS AT OUR STORE... 
IF EXISTS (SELECT * 
      FROM #Files F 
      LEFT OUTER JOIN #StoresHaveFiles SHF ON F.IDFile=SHF.IDFile 
      LEFT OUTER JOIN #Stores S ON SHF.IDStore=S.IDStore 
      WHERE [email protected] 
      AND F.[FileName][email protected]) 
BEGIN 
    -- IF THE FILE IS NOT AT ANY OTHER STORE 
    IF NOT EXISTS (SELECT * 
        FROM #Files F 
        LEFT OUTER JOIN #StoresHaveFiles SHF ON F.IDFile=SHF.IDFile 
        LEFT OUTER JOIN #Stores S ON SHF.IDStore=S.IDStore 
        WHERE S.StoreName<>@StoreToDeleteFrom 
        AND F.[FileName][email protected]) 
    BEGIN 
     -- GO AHEAD AND DELETE FILE EVERYWHERE... 
     PRINT 'DELETE FILE' 

     DELETE SHF 
     FROM #Stores S 
     JOIN #StoresHaveFiles SHF 
      ON S.IDStore=SHF.IDStore 
      JOIN #Files F 
       ON SHF.IDFile=F.IDFile 
       AND F.[FileName][email protected] 
     WHERE [email protected] 

     DELETE FCF 
     FROM #Files F 
     JOIN #FilesContainsFiles FCF 
      ON F.IDFile=FCF.IDContentFile 
     WHERE F.[FileName][email protected] 

     DELETE FCF 
     FROM #Files F 
     JOIN #FilesContainsFiles FCF 
      ON F.IDFile=FCF.IDContainerFile 
     WHERE F.[FileName][email protected] 

     DELETE F 
     FROM #Files F 
     WHERE [FileName][email protected] 
    END 
    ELSE 
    BEGIN 
     -- ONLY DELETE FROM STORE 
     PRINT 'DELETE FILE FROM STORE ONLY' 

     DELETE SHF 
     FROM #Stores S 
     JOIN #StoresHaveFiles SHF 
      ON S.IDStore=SHF.IDStore 
      JOIN #Files F 
       ON SHF.IDFile=F.IDFile 
       AND F.[FileName][email protected] 
     WHERE [email protected] 
    END 
END 
ELSE 
BEGIN 
    -- ITS NOT AT THAT STORE... 
    PRINT 'NOTHING TO DELETE' 
END 


SELECT * 
FROM #Files F 
LEFT OUTER JOIN #FilesContainsFiles FParent ON F.IDFile=FParent.IDContainerFile 
LEFT OUTER JOIN #StoresHaveFiles SHF ON F.IDFile=SHF.IDFile 
LEFT OUTER JOIN #Stores S ON SHF.IDStore=S.IDStore