ms 触发器 及 主键生成方式问题
项目需要 写了个简单的ms数据库的
--判断触发器是否存在如果存在就删除
设置对什么表创建触法器,触法时机:插入、更新、删除
通过判断 inserted 表 和 deleted 表来缺点是插入操作 下面语句的功能是把插入的数据备份到一临时表里面
下面语句的功能是把更新的数据备份到一临时表里面 记录状态
下面语句的功能是把删除的数据备份到一临时表里面 记录状态
在做触法器的时候发现一个问题 ibatis的主键生成方式有好几种
之前项目中的这种主键生成方式是不安全滴
之后更改成 下面 就解决了主键不一致的问题
看出其中的区别了没
--判断触发器是否存在如果存在就删除
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
--插入
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
之前项目中的这种主键生成方式是不安全滴
<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>