记一次SQL Server Insert触发器编写过程

实现功能:新增特定类型的新闻时,自动追加特定的背景图片。

第一版(错误信息:不能在 'inserted' 表和 'deleted' 表中使用 text、ntext 或 image 列),代码如下:

--创建insert插入类型触发器
if (object_id('tgr_news_QA_insert', 'tr') is not null)
    drop trigger tgr_news_QA_insert
go

create trigger tgr_news_QA_insert
on news
     for insert --插入触发
as
    --定义变量
    declare @id bigint, @content nvarchar(max),@newstype bigint;

    --在inserted表中查询已经插入记录信息
    select @id = id, 
    @content = [content],
    @newstype = newstype 
    from inserted

    --处理问题解答数据
    if @newstype=101
    begin
        set @content = '<div style="background:url(''images/newsBackgroundImg.jpg'') no-repeat;width:700px;height:600px;  "><div width=''100%'' style=''text-align:left;''>'+@content+'</div></div>'
        update news set content=@content where id=@id
    end

go

于是改成instead of insert触发器,代码如下:

--创建insert插入类型触发器
if (object_id('tgr_news_QA_insert', 'tr') is not null)
    drop trigger tgr_news_QA_insert
go

create trigger tgr_news_QA_insert
on news
     instead of insert --插入触发
as
    --定义变量
    declare @id bigint, @content nvarchar(max),@newstype bigint;

    --在inserted表中查询已经插入记录信息
    select @id = id, 
    @content = [content],
    @newstype = newstype 
    from inserted

    --处理对应类型的数据
    if @newstype=101
    begin
        set @content = '<div style="background:url(''images/newsBackgroundImg.jpg'') no-repeat;width:700px;height:600px;  "><div width=''100%'' style=''text-align:left;''>'+@content+'</div></div>'
        insert into news 
        select id, newstype, title, @content content, 
        from inserted
    end
    else
        insert into news 
        select * from inserted      

以上插入触发器代码虽然没有报错,也实现了效果,但是存在漏洞。

  1. ntext转nvarchar(max)是否会有数据丢失
  2. inserted 数据不一定只有一条

最终版:

--创建insert插入类型触发器
if (object_id('tgr_news_QA_insert', 'tr') is not null)
    drop trigger tgr_news_QA_insert
go

create trigger tgr_news_QA_insert
on news
     instead of insert --插入触发
as
        insert into news 
        select id, 
            newstype,
            title, 
            '<div style="background:url(''images/newsBackgroundImg.jpg'') no-repeat;width:700px;height:600px;  "><div width=''100%'' style=''text-align:left;''>'+convert(nvarchar(max),content)+'</div></div>', 
        from inserted
        where newstype=101

        insert into news 
        select id, 
            newstype,
            title, 
            [content], 
        from inserted
        where newstype<>101

 

关于SQL Server 2005中NTEXT与NVARCHAR(MAX)参考:http://www.cnblogs.com/dudu/archive/2009/10/17/1585152.html 

转载于:https://www.cnblogs.com/xuezhizhang/p/3363723.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值