首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

触发器不执行,为什么,该怎么处理

2012-01-31 
触发器不执行,为什么CREATETRIGGERTR_CHENGJION[dbo].[成绩表]AFTERINSERTASdeclare@fenintbeginupdate成

触发器不执行,为什么
CREATE   TRIGGER     TR_CHENGJI   ON   [dbo].[成绩表]  
AFTER   INSERT
AS
declare   @fen   int
begin
update   成绩表   set   名次   =   名次   +   1   where   分数   > @fen
END


/*****************************************************
private   void   button1_Click(object   sender,   EventArgs   e)
                {
                        int   t;
                        t=**;//两位随机数
                        string   strConn   =   @ "Data   Source=127.0.0.1,1433;Initial   Catalog=gpData;User   ID=sa;Password=***** ";
                        SqlConnection   myConnection   =   new   SqlConnection(strConn);
                        myConnection.Open();
                        string   myCommandText   =   @ "INSERT   INTO   成绩表   (名次,姓名,分数)   Values   ( "   +
                            " '1 ', 'fg ', ' "   +   t   +   " ') ";

                        SqlCommand   myCommand   =   new   SqlCommand(myCommandText,   myConnection);
                        myCommand.ExecuteNonQuery();
                        myConnection.Close();
                }
//************************************
我在程序里按了按纽之后,记录是添加进去了,可名次就是不改变,还是1,这是为什么?

[解决办法]
你的触发器是不是被你无意间禁用了

启用 ENABLE TRIGGER ALL ON [dbo].[成绩表]
[解决办法]
什么添进去?
你随便找个地方运行看看你的触发器有没被禁用了
select is_disabled from sys.triggers where name = 'TR_CHENGJI '
如果是1就禁用了,那你就打开,是0就算了


另外建议你看看你的 where 分数 > @fen 是不是这里的问题?,每次可能一个什么条件都没满足,因为不知道你的分数字段是 int 还是 numeric ,如果你字段的类型不行,你的条件可能永远不会成立,所以每次都没更新

[解决办法]
> @fen 有值吗?

[解决办法]
declare @fen int
begin
update 成绩表 set 名次 = 名次 + 1 where 分数 > @fen
--------------------------------------
没有为@fen赋值,则@fen默认为NULL,这样的话where返回假值,所以更新不会成功.请为@fen赋值试试.
[解决办法]
?

CREATE TRIGGER TR_CHENGJI ON [dbo].[成绩表]
AFTER INSERT
AS
declare @fen int
select @fen=分数 from inserted
begin
update 成绩表 set 名次 = 名次 + 1 where 分数 > @fen
END
[解决办法]
才看到楼主的另外一个帖子:
http://community.csdn.net/Expert/topic/5678/5678495.xml?temp=.181637
原来楼主是要在插入的时候自动重排名次.使用触发器这样的处理方法在数据量少的时候还可以,但数据量多的时候会影响性能.


如果就楼主本身的需求来讲,完全可以不用在插入的时候自动计算名称,而是在查询的时候再生成名次,例如:
----创建测试数据
declare @t table(姓名 varchar(10),成绩 int)
insert @t
select 'a ',60 union all
select 'b ',50 union all
select 'c ',40 union all
select 'd ',80 union all
select 'e ',90

----查询
select
名次 = (select count(*) from @t where 成绩 > = a.成绩),
* from @t as a order by 名次

/*结果
名次 姓名 成绩
----------- ---------- -----------
1 e 90
2 d 80
3 a 60
4 b 50
5 c 40
*/

热点排行