ms 觸發器 及 主鍵產生方式問題項目需要 寫了個簡單的ms資料庫的
--判斷觸發器是否存在如果存在就刪除
IF EXISTS (SELECT name FROM sysobjects
WHERE name='TRICARRIGE' AND type='TR')
DROP TRIGGER TRICARRIGE
go
設定對什麼表建立觸法器,觸法時機:插入、更新、刪除
CREATE TRIGGER [TRICARRIGE]
ON [dbo].[T_table]
AFTER INSERT,UPDATE,DELETE
AS
BEGIN
通過判斷 inserted 表 和 deleted 表來缺點是插入操作 下面語句的功能是把插入的資料備份到一暫存資料表裡面
--插入
IF EXISTS (SELECT 1 FROM inserted) AND NOT EXISTS (SELECT 1 FROM deleted)
BEGIN
INSERT INTO T_DEST_BACKUP
SELECT i.ID,'T_DEST_TABLE','A',i.GID FROM inserted i
END
下面語句的功能是把更新的資料備份到一暫存資料表裡面 選項組
--更新
IF EXISTS (SELECT 1 FROM inserted) AND EXISTS (SELECT 1 FROM deleted)
BEGIN
INSERT INTO T_DEST_BACKUP
SELECT i.ID,'T_DEST_TABLE',
CASE WHEN i.ACTIVATE = 1
THEN 'U'
WHEN i.ACTIVATE = 0
THEN 'D'
ELSE ''
END,i.GID
FROM inserted i
END
下面語句的功能是把刪除的資料備份到一暫存資料表裡面 選項組
--刪除
IF NOT EXISTS (SELECT 1 FROM inserted) AND EXISTS (SELECT 1 FROM deleted)
BEGIN
INSERT INTO T_DEST_BACKUP
SELECT d.ID,'T_DEST_TABLE','D',d.GID FROM deleted d
END
SET NOCOUNT ON;
END
GO
在做觸法器的時候發現一個問題 ibatis的主鍵產生方式有好幾種
之前項目中的這種主鍵產生方式是不安全滴
<insert id="inserUser" parameterClass="userBean" >
<![CDATA[ insert into T_TABLE(NAME) values (#name:NVARCHAR#)]]>
<selectKey resultClass="int" keyProperty="id" >
select @@IDENTITY as id
</selectKey>
</insert>
之後更改成 下面 就解決了主鍵不一致的問題
<insert id="inserUser" parameterClass="userBean" >
<selectKey resultClass="int" keyProperty="id" >
<![CDATA[
insert into T_TABLE(NAME) values (#name:NVARCHAR#)
select SCOPE_IDENTITY() as id
]]>
</selectKey>
</insert>
看出其中的區別了沒