34,873
社区成员
发帖
与我相关
我的任务
分享/* 监视UPDATE */
ALTER TRIGGER OnStatusChanged
ON 某表
FOR UPDATE
AS
IF(UPDATE([某字段]))
BEGIN
BEGIN TRAN
EXEC 调用一个存储过程
IF(@@error <> 0)
BEGIN
ROLLBACK TRAN
END
COMMIT TRAN
END
GO
ALTER TRIGGER OnStatusChanged
ON 某表
FOR UPDATE
AS
IF(UPDATE([某字段]))
BEGIN
ALTER TRIGGER OnStatusChanged
ON 某表
FOR UPDATE
AS
IF(UPDATE([某字段]))
BEGIN
BEGIN TRAN
EXEC 调用一个存储过程
IF(@@error <> 0)
BEGIN
ROLLBACK TRAN
END
COMMIT TRAN
END
GO
EXEC 调用一个存储过程
IF(@@error <> 0)
BEGIN
ROLLBACK TRAN
END
COMMIT TRAN
END
GO
/* 监视UPDATE */
ALTER TRIGGER OnStatusChanged
ON A
FOR UPDATE
AS
IF(UPDATE(PRODUCT))
BEGIN
IF @@TRANCOUNT > 1
SAVE TRAN ORIGINAL
BEGIN TRY
UPDATE A SET COST = 999 WHERE ID IN (SELECT TOP 1 ID FROM DELETED)
RAISERROR 130033 'PRINT ERROR'
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 1 /*出错回滚*/
ROLLBACK TRAN ORIGINAL
ELSE
ROLLBACK
BEGIN TRAN
END CATCH
END
GO
SELECT * FROM A
BEGIN TRAN
UPDATE A SET Product = 'KKUN' WHERE ID = 1
COMMIT TRAN---經過測試 ,會回滾
IF OBJECT_ID('TA')IS NOT NULL DROP TABLE TA
GO
CREATE TABLE TA( ID INT IDENTITY,性別 NVARCHAR(5) CHECK(性別 IN(N'男',N'女')))
IF OBJECT_ID('PRO_TEST')IS NOT NULL DROP PROC PRO_TEST
GO
CREATE PROC PRO_TEST
@SEX NVARCHAR(5)
AS
INSERT TA SELECT @SEX
GO
IF OBJECT_ID('TB')IS NOT NULL DROP TABLE TB
GO
CREATE TABLE TB(ID INT ,[NAME] VARCHAR(10))
INSERT TB SELECT 1,'張三'
IF OBJECT_ID('TRI_TEST')IS NOT NULL DROP TRIGGER TRI_TEST
GO
CREATE TRIGGER TRI_TEST ON TB
FOR UPDATE
AS
IF UPDATE(ID)
BEGIN TRAN
EXEC PRO_TEST 'TEST'
IF(@@error <> 0)
BEGIN
ROLLBACK TRAN
END
COMMIT TRAN
GO
UPDATE TB SET ID=888 WHERE ID=1
/*伺服器: 訊息 547,層級 16,狀態 1,程序 PRO_TEST,行 4
INSERT 陳述式與 COLUMN CHECK 條件約束 'CK__TA__性別__60A75C0F' 發生衝突。衝突發生於資料庫 'db_study',資料表 'TA', column '性別'。
陳述式已經結束。*/
理论上会...
IF OBJECT_ID('TRI_TEST')IS NOT NULL DROP TRIGGER TRI_TEST
GO
CREATE TRIGGER TRI_TEST ON TB
FOR UPDATE
AS
set xact_abort off
IF UPDATE(ID)
save tran procTran
EXEC PRO_TEST 'TEST'
IF(@@error <> 0)
ROLLBACK TRAN procTran
ELSE
COMMIT TRAN procTran
set xact_abort on
GO
UPDATE TB SET ID=888 WHERE ID=1
select * from tb
/*
ID NAME
----------- ----------
888 張三
(1 行受影响)
*/set xact_abort offset xact_abort onALTER TRIGGER OnStatusChanged
ON 某表
FOR UPDATE
AS
begin
if @@trancount>0
commit
IF(UPDATE([某字段]))
EXEC 调用一个存储过程
end