PDA

View Full Version : update lồng nhau



vtth
22-11-2004, 14:40
Chào các bạn
Mình co' csdl như thế này nè:
Table: Task (TasID, TasparentID, status)
ví dụ:
TasID TasparentID Status
A 1
B A 2
C B 3
D C 2
khi mình update status của TasID A = 4(stop) thì status của các task: B, C, D đều phải cập nhật= 4 vì B là con của A, C la con của B, D là con của C.
Bạn nào giúp mình với.

sontinh2004
23-11-2004, 04:47
Vtth co the dung UPDATE TRIGGER ...

Neu ban chua bao gio dung trigger, ban co the nghien cuu o day (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_create2_7eeq.asp)

Trigger cua ban se chay mot stored procedure tuong tu nhu trong bai sau
(http://www.diendantinhoc.com/showthread.htm?t=45890)

(Mot cach khac la chay SP, ma khong dung trigger. Tuy nhien, cai gia phai tra la cac code ma update table cua ban deu phai goi SP nay ( trong khi trigger co the tu dong lam dieu do). Neu mot nguoi trong team cua ban khong biet, se update table ... ma quen goi SP. Do do, tui thay dung trigger van co loi hon ...)


Good luck

vtth
23-11-2004, 08:27
Cảm ơn sontinh2004, mình sẽ chuyển SP ở (http://www.diendantinhoc.com/showthread.htm?t=45890) sang trigger xem sao.

vtth
23-11-2004, 10:02
sontinh2004 oi mình có đoạn trigger vầy nè, mình có thể lồng vòng lặp while như thế nào nhỉ, vì như thế này thì nó chỉ cập nhật có 1 cấp task con à:

CREATE TRIGGER [UpdateStatus1] ON [dbo].[Task]
FOR UPDATE
AS
DECLARE @tas nvarchar(20),
@status tinyint,
@statusdate datetime,
@newstatus tinyint,
@newstatusdate datetime,
@T nvarchar(20),
@S tinyint,
@istatus tinyint,
@SD datetime
if update(Status)
begin transaction
select @tas = tasid from deleted
select @status = status from deleted
select @statusdate = statusdate from deleted
select @newstatus = status from inserted
select @newstatusdate = statusdate from inserted
--Stop or cancel task
if (@newstatus = 3 or @newstatus =4 ) and (@status !=5)
insert TaskProcess(TasProID,TasID,Status, StatusDate)
values (newid(),@tas,@status,@statusdate)

Declare CursorX CURSOR FOR
SELECT TasID,Status,StatusDate FROM Task WHERE TaskParentid=@tas
OPEN CursorX
FETCH NEXT FROM CursorX INTO @T,@S,@SD
WHILE @@FETCH_STATUS = 0
BEGIN

if (@newstatus = 3 or @newstatus =4) and (@status!=5) --3: Cancel, 4: Stop
begin
insert TaskProcess (TasProID,TasID,Status, StatusDate)
values (newid(),@T,@S,@SD)
update task
set status = @newstatus,
statusdate = @newstatusdate
where tasid =@T
end
FETCH NEXT FROM CursorX INTO @T,@S,@SD
END
CLOSE CursorX
DEALLOCATE CursorX

IF @@Error > 0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION

sontinh2004
24-11-2004, 12:13
CREATE TRIGGER UpdateTask
ON TASK
INSTEAD OF UPDATE
AS
DECLARE @err int
DECLARe @status int
DECLARe @taskID varchar(100)
DECLARe @taskID2 varchar(100)

IF UPDATE(Status)
BEGIN

select @status = i.status, @taskID = i.TaskID from INSERTED i

while exists(select 1 from TASK T where TaskID = @taskID)
begin
PRINT @status
PRINT 'select 1 from TASK T where TaskID =' + @taskID

BEGIN TRANSACTION
UPDATE TASK SET Status = @status WHERE TaskID = @taskID

SET @err = @@ERROR
IF @err<>0
ROLLBACK TRANSACTION
ELSE
COMMIT

IF exists(select 1 from TASK T where T.ParentTaskID = @taskID)
select @taskID = TaskID from TASK T where T.ParentTaskID = @taskID
ELSE
BREAK
end
END

GO


VTTH - Khi update status cua taskid A bang 4, tat ca status cac task con deu duoc gan bang 4. Do la phan quan trong. Ban co the sua doi de no chay theo y cua ban. Lau qua khong lam Sql Server ... my skills are rusty now =(

Good luck