insert 触发器

handsome1234 2018-12-04 09:10:33
我通过界面往YHJ_GYH_GB_CODE表里插入数据,我特意A3这个字段没有插进去。
想通过触发器来实现,写了如下脚本:
结果发现同样的数据插进去2条,一个A3带日期的,一个A3不带日期的,
我估计是触发器这里的问题,不知我想的通过前台界面插入A1,A2的同时把A3顺便给插个日期值的想法,是否能通过触发器实现?


--DROP TRIGGER YHJ_GYH_GB_CODE_INSERT

CREATE TRIGGER [dbo].YHJ_GYH_GB_CODE_INSERT ON [dbo].YHJ_GYH_GB_CODE
FOR INSERT
AS
BEGIN
INSERT INTO YHJ_GYH_GB_CODE
( A1 ,
A2 ,
A3
)
SELECT inserted.A1 ,
inserted.A2 ,
CONVERT(VARCHAR(100), GETDATE(), 21)
FROM inserted;


END
...全文
154 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
handsome1234 2020-07-28
  • 打赏
  • 举报
回复

用这个,就OK了。感谢各位:
CREATE TRIGGER [dbo].YHJ_GYH_GB_CODE_TEST_INSERT ON [dbo].YHJ_GYH_GB_CODE_TEST
    INSTEAD OF INSERT
AS
    BEGIN
        INSERT  INTO YHJ_GYH_GB_CODE_TEST
                ( A1 ,
                  A2 ,
                  A3
                )
                SELECT  inserted.A1 ,
                        inserted.A2 ,
                        CONVERT(VARCHAR(100), GETDATE(), 21)
                FROM    inserted;
	
	
    END
1、改成用instead of 的触发器, 2、用约束。也是好办法。虽然我没测试。
RINK_1 2018-12-05
  • 打赏
  • 举报
回复
你这个如果要用触发器,得用INSTEAD OF,否则就像#2版主那样处理就可以了。
wwfxgm 2018-12-05
  • 打赏
  • 举报
回复
create table YHJ_GYH_GB_CODE(A1 int, A2 int, A3 varchar(30))
go

CREATE TRIGGER [dbo].YHJ_GYH_GB_CODE_INSERT ON [dbo].YHJ_GYH_GB_CODE
instead of insert
AS
BEGIN
INSERT INTO YHJ_GYH_GB_CODE
( A1 ,
A2 ,
A3
)
SELECT inserted.A1 ,
inserted.A2 ,
CONVERT(VARCHAR(100), GETDATE(), 21)
FROM inserted;


END
go

insert into YHJ_GYH_GB_CODE(A1,A2) values(11,111)
go
insert into YHJ_GYH_GB_CODE(A1,A2,A3) values(22,222,'2011-01-01')
go
select * from YHJ_GYH_GB_CODE
go
drop table YHJ_GYH_GB_CODE
go

结果是:
11 111 2018-12-05 20:35:05.110
22 222 2018-12-05 20:35:05.123

wwfxgm 2018-12-05
  • 打赏
  • 举报
回复
学习了。 这个instead of触发器,我自己写写看看。
卖水果的net 版主 2018-12-05
  • 打赏
  • 举报
回复

-- 楼主,把你的测试结果发上来。

--DROP TRIGGER YHJ_GYH_GB_CODE_INSERT
create table YHJ_GYH_GB_CODE(A1 int, A2 int, A3 varchar(30))
go

CREATE TRIGGER [dbo].YHJ_GYH_GB_CODE_INSERT ON [dbo].YHJ_GYH_GB_CODE
    FOR INSERT
AS
    BEGIN
        INSERT  INTO YHJ_GYH_GB_CODE
                ( A1 ,
                  A2 ,
                  A3
                )
                SELECT  inserted.A1 ,
                        inserted.A2 ,
                        CONVERT(VARCHAR(100), GETDATE(), 21)
                FROM    inserted;
	
	
    END
go

insert into YHJ_GYH_GB_CODE(A1,A2) values(11,111)
go
insert into YHJ_GYH_GB_CODE(A1,A2,A3) values(22,222,'2011-01-01')
go
select * from YHJ_GYH_GB_CODE
go
drop table YHJ_GYH_GB_CODE
go


A1          A2          A3
----------- ----------- ------------------------------
11          111         NULL
11          111         2018-12-05 08:22:49.467
22          222         2011-01-01
22          222         2018-12-05 08:22:49.473

(4 行受影响)


吉普赛的歌 版主 2018-12-05
  • 打赏
  • 举报
回复
不用那么麻烦, 加个默认约束就可以了:
ALTER TABLE YHJ_GYH_GB_CODE ADD CONSTRAINT DF_YHJ_GYH_GB_CODE_A3 DEFAULT GETDATE() FOR A3;
加约束之后, 你在执行
INSERT  INTO YHJ_GYH_GB_CODE ( A1 , A2  ) VALUES( @A1, @A2 )
语句时, A3 会自动赋默认值 , 不需要你操心的。
二月十六 版主 2018-12-05
  • 打赏
  • 举报
回复
楼主两个表结构什么样的。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧