webForumDet fria alternativet

Triggers och rekursivitet

Databaser & SQLur Databashanterare & SQL

4 svar · 449 visningar · startad av Addeladde

AddeladdeMedlem sedan jan. 20013 406 inlägg
#1

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
#2

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?

AddeladdeMedlem sedan jan. 20013 406 inlägg
#3

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
#4

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.

AddeladdeMedlem sedan jan. 20013 406 inlägg
#5

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
134 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)