·只有inserted表有數據時,當前操作為insert;
·inserted和deleted兩張表都有數據時,當前操作為update;
·只有deleted表有數據時,當前操作為delete。
1.
CREATE TRIGGER trTask_Update ON dbo.Task
FOR UPDATE
AS
BEGIN
DECLARE @TaskId INT
DECLARE @NewTaskOrder INT
DECLARE @WorkstreamId INT
DECLARE @OldTaskOrder INT
--update
BEGIN
SELECT @TaskId = id ,
@OldTaskOrder = TaskOrder ,
@WorkstreamId = WorkstreamId
FROM deleted
SELECT @NewTaskOrder = TaskOrder
FROM dbo.Task
WHERE Id = @TaskId
--When updating a row, if old value is greater than new value, then +1 all values that are >= the new value and < the old value
IF @OldTaskOrder > @NewTaskOrder
BEGIN
UPDATE dbo.Task
SET TaskOrder = TaskOrder + 1
WHERE WorkstreamId = @WorkstreamId
AND TaskOrder >= @NewTaskOrder
AND TaskOrder < @OldTaskOrder
AND Id <> @TaskId
END
IF @OldTaskOrder < @NewTaskOrder
BEGIN
UPDATE dbo.Task
SET TaskOrder = TaskOrder - 1
WHERE WorkstreamId = @WorkstreamId
AND TaskOrder <= @NewTaskOrder
AND TaskOrder > @OldTaskOrder
AND Id <> @TaskId
END
END
END
2.
CREATE TRIGGER trTask_Insert ON dbo.Task
FOR INSERT
AS
BEGIN
DECLARE @TaskId INT
DECLARE @NewTaskOrder INT
DECLARE @WorkstreamId INT
DECLARE @OldTaskOrder INT
--insert
BEGIN
SELECT @TaskId = id ,
@NewTaskOrder = TaskOrder ,
@WorkstreamId = WorkstreamId
FROM INSERTED
--When inserting a new,+1 to all task orders that are equal to or greater than the newly inserted task's task order
UPDATE dbo.Task
SET TaskOrder = TaskOrder + 1
WHERE WorkstreamId = @WorkstreamId
AND TaskOrder >= @NewTaskOrder
AND Id <> @TaskId
END
END
3.如何調試觸發器:
一、打開SQL查詢分析器
二、將以下Sql語句復制到查詢窗口並運行
use pubs
CREATE trigger trigger_update on authors
for update
as
begin
print('update lastname=hoho')
end
CREATE proc Authors_procInsert
as
begin
update authors set au_lname='HOHO' where au_id='172-32-1176'
end
三、在左邊的對象瀏覽器中選擇pubs->存儲過程在Authors_procInsert(如未出現請刷新pubs數據庫)上右擊‘Execute stored procedure’,設置參數點擊確定打開生成的執行存儲過程的腳本 -> 點擊SQL Server Management 菜單上的Debug -> Start Debugging...
四、當運行到" update authors set au_lname='HOHO' where au_id='172-32-1176'“時按“F11”即進入觸發器代碼
