sqlserver触发器

SqlServer中用@@IDENTITY取最新ID不准的问题

ぃ、小莉子 提交于 2020-01-08 23:40:53
一个网友问我一个关于@@IDENTITY的问题。他的数据库中有一个存储过程,有 insert语句,然后马上就用SELECT @@IDENTITY取刚插入的ID值,通常这是没有问题的,但是问题是ID实际上已经达到了100多万了,而 SELECT @@IDENTITY 返回的只有很小的值(才30多),令人费解。 我开始也不太明白,问他先别管@@IDENTITY,新插入记录,ID是多少。他说ID是100多万那么大的数。不是才几十那么小。我帮他分析可能性,是不是identity到了最大限,且identity最大是2的64次方。他说int 最大值是 2,147,483,647,他的ID离溢出还早呢, 但是 return @@IDENTITY 就是 很小的值(只有几十)。我然后又帮他分析道,是不是ID的值被重置过?他说不是,他说现在新插入的 id 就是 170多万。说到这里,我了解了一点了。我建议他用scope_identity(table_name)函数来取指定表的IDENTITY。我们以前有过经验,@@IDENTITY和IDENTITY_CURRENT()都不是很理想,因为它们会受当前表的范围影响。通常有触发器就会引起@@IDENTITY不能正确地取值,IDENTITY_CURRENT()也是如此。幸好有scope_identity(table_name)函数。在这种情况下就只能用这个

SqlServer触发器常用语法AFTER、INSTEAD OF及其详解

匿名 (未验证) 提交于 2019-12-03 00:11:01
先创建一个简单的触发器 CREATE TRIGGER trigger_name ON table_name [WITH ENCRYPTION] FOR | AFTER | INSTEAD OF [DELETE, INSERT, UPDATE] AS T-SQL语句 GO触发器位置:数据库>表>我这里是表名table_name>触发器解释:1、[WITH ENCRYPTION]:表示将该触发器加密,加密后触发器执行方法将无法被查看[DELETE, INSERT, UPDATE]对应为当执行删除、插入、更新三种动作时被触发 执行insert时,获取插入后的数据,可用select*from inserted读取执行delete时,获取删除前的数据,可用select*from deleted读取执行update时,获取更新前的数据,可用select*from deleted读取,获取更新后数据,可用select*from inserted读取 2、AFTER:操作成功后(这里是插入table_a后),执行触发器操作例如 CREATE TRIGGER T_AON table_aafter insertas begindeclare @id int,@name varchar(20)select @id=id,@name=name from insertedinsert into table

SqlServer触发器

て烟熏妆下的殇ゞ 提交于 2019-11-30 21:13:07
概念:   触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。 触发器和存储过程的区别:   触发器与存储过程的区别是运行方式的不同,触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行而存储过程需要用户,应用程序或者触发器来显示地调用并执行。 一:触发器的优点  1.触发器是自动的。当对表中的数据做了任何修改之后立即被激活。  2.触发器可以通过数据库中的相关表进行层叠修改。  3.触发器可以强制限制。这些限制比用CHECK约束所定义的更复杂。与CHECK约束不同的是,触发器可以引用其他表中的列。 二:触发器的作用  触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂参照完整性和数据的一致性,它能够对数据库中的相关表进行级联修改,提高比CHECK约束更复杂的的数据完整性,并自定义错误消息。触发器的主要作用主要有以下接个方面: 强制数据库间的引用完整性