Hej
Kan man på något sätt ta bort poster rekursivt med triggers?
Om jag har en tabell med id och parentID och sedan har en trigger som tar bort alla poster där id på posten man tar bort som parentID. När sedan de posterna tas bort så borde ju nya triggers gå igång och köras på de posterna osv...
Men det fungerar inte för mig. Den fortsäter inte att ta bort ner i strukturen. Bara första ledet.
Använder MS SQL SERVER 2005
ALTER TRIGGER [dbo].[deleteFilesAndFolders]
ON [dbo].[myFiles]
AFTER DELETE
AS
DECLARE @fileID INT
DECLARE @isFolder BIT
SELECT @fileID = (SELECT fileID FROM Deleted)
SELECT @isFolder = (SELECT fileIsDir FROM Deleted)
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
IF @isFolder <> 1
INSERT INTO myFilesDeleted (fileID) VALUES(@fileID)
ELSE
DELETE FROM myFiles Where fileParentDirectoryID = @fileID
END
LarsGMedlem sedan dec. 200012 464 inlägg Du måste sätta RECURSIVE_TRIGGERS
Är det meningen att din trigger inte kan hantera att man gör delete på flera poster i samma statement?
Den ska kunna deleta flera poster samtidigt.
Så här ser min tabell ut:
fileID int
fileName nvarchar(255)
fileExtension varchar(10)
filePath varchar(100)
fileIsDir bit
fileParentDirectoryID int
UserID uniqueidentifier
fileType tinyint
fileSize int
fileMIME varchar(32)
Den hanterar filer och kataloger. Katalogstrukturen kan vara oändlig och tar man bort en mapp ska alla mappar under samt filer tas bort. Alla filer som tas bort ska överföras till en myFilesDeleted. Endast id behöver överföras. Detta för att filen sedan fysiskt ska kunna tas bort.
Märkte nu när jag satt rekursivitet på triggers så funkade det inte att ta bort eftersom den genererade fler än 32 poster. dock var det bara tre kataloger som låg under varandra utan filer. Så något fel måste det vara med min trigger.
LarsGMedlem sedan dec. 200012 464 inlägg Det jag menar är att om deleted innehåller flera poster så går följande fel.
SELECT @fileID = (SELECT fileID FROM Deleted)
Du måste ha med deleted i din update och insert.
Okej
Den hä triggern verkar dock fungera bra.
IF @@rowcount = 0 RETURN
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
INSERT INTO myFilesDeleted(fileName, fileExtension, filePath, fileIsDir, fileParentDirectoryID, UserID, fileSize)
(SELECT fileName, fileExtension, filePath, fileIsDir, fileParentDirectoryID, UserID, fileSize FROM Deleted Where fileIsDir = 0)
DELETE FROM MF
FROM myFiles AS MF JOIN deleted AS D
ON MF.fileParentDirectoryID = D.fileID
END