SQL Server写触发器遇到的问题:列前缀与表名或别名不匹配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server写触发器遇到的问题:列前缀与表名或别名不匹配相关的知识,希望对你有一定的参考价值。

CREATE TRIGGER Proleftchance
ON T_ProApply
AFTER UPDATE
AS
if (select proLeftChance from T_Project
where T_ProApply.proID=T_Project.proID)>0 and (select ApplyState from T_Project
where T_ProApply.proID=T_Project.proID)='已通过'

update T_Project set proLeftChance=proLeftChance-1
from T_ProApply,T_Project
where T_ProApply.proID=T_Project.proID

错误提示:
服务器: 消息 107,级别 16,状态 3,过程 Proleftchance,行 5
列前缀 'T_ProApply' 与查询中所用的表名或别名不匹配。
服务器: 消息 107,级别 16,状态 1,过程 Proleftchance,行 5
列前缀 'T_ProApply' 与查询中所用的表名或别名不匹配。

目的是:当proApply表插入时,更新project表的 proLeftChance的值减1,并要检查刚刚proApply表插入时 ApplyState是否为‘已通过’, proLeftChance的值要大于0.

求高手帮助!!谢谢!!

参考技术A 你触发器的语法错了,后触发,应该在表名前面
after insert on table
参考技术B 表名应该是inserted吧

if (select proLeftChance from T_Project
where inserted.proID=T_Project.proID)>0 and (select ApplyState from T_Project
where inserted.proID=T_Project.proID)='已通过'

Sql server --触发器

Sql server --触发器

概念:
触发器是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对一个表进行操作(Insert,delete,update)时就会激活它执行,触发器经常用于加强数据完整性约束和业务规则等。触发器可以从DBA_TRIGGers,USER_TRIGGERS数据字典种查到。
触发器和存储过程的区别:
触发器与存储过程的区别是运行方式的不同,触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行而存储过程需要用户,应用程序或者触发器来显示地调用并执行。

触法器的优点:

1.触发器是自动,当对表中的数据做了任何修改之后立即被激活。
2.触发器可以通过数据库中的相关表进行层叠修改。
3.触发器可以强制限制,这些限制比用CHECHK约束所定义的更复杂。与CHECHK约束不同的是触发器可以引用其他表中的列。

触发器的作用:

触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂参照完整性和数据的一致性,它能够对数据库中的相关表进行级联修改,提高比CHECK约束更复杂的的数据完整性,并自定义错误消息。触发器的主要作用主要有以下接个方面:

1.强制数据库间的引用完整性
2.级联修改数据库中所有相关的表,自动触发其它与之相关的操作
3.跟踪变化,撤销或回滚违法操作,防止非法修改数据
4.返回自定义的错误消息,约束无法返回信息,而触发器可以
5.触发器可以调用更多的存储过程

触发器的工作原理:
1.系统自动在内存中创建deleted表或inserted表;
2.只读,不允许修改,触发器执行完成后,自动删除。

inserted表:
    1.临时保存了插入或更新后的记录行;
    2.可以从inserted表中检查插入的数据是否满足业务需求;
    3.如果不满足,则向用户发送报告错误消息,并回滚插入操作。 

deleted表:
    1.临时保存了删除或更新前的记录行;
    2.可以从deleted表中检查被删除的数据是否满足业务需求;
    3.如果不满足,则向用户报告错误消息,并回滚插入操作

例如:创建insert触发器:

--创建一个触发器
    create trigger trig_insert
--来自于那张表
    on student
--什么操作 
    after insert
    as
    begin
         if object_id(N‘student_sum‘,N‘U‘) is null--判断student_sum表是否存在
         create table student_sum(stuCount int default(0));--创建存储学生人数的student_sum表
         declare @stuNumber int;
         select @stuNumber = count(*)from student;
         if not exists (select * from student_sum)--判断表中是否有记录
         insert into student_sum values(0);
         update student_sum set stuCount [email protected]; --把更新后总的学生数插入到student_sum表中
    end

以上是关于SQL Server写触发器遇到的问题:列前缀与表名或别名不匹配的主要内容,如果未能解决你的问题,请参考以下文章

sql server 2005代码错误 提示插入错误: 列名或所提供值的数目与表定义不匹配。

sql加列前缀查询时遇到一个问题

SQL Server 触发器

SQL SERVER 触发器

Sql server --触发器

MYSQL批量修改表前缀与表名sql语句