您的位置:首页 > 其它

ms 触发器 及 主键生成方式问题

2011-11-09 21:33 232 查看

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>

看出其中的区别了没
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: