sql触发器判断
㈠ mssql触发器判断语句
你的问题还是没有描述清楚,那就先回答我的问题:
1,AID、BID、CID是不是按照序列方式递增的,如:1,2,3, ............
2,AID、CID列的数据是不是提前已经写好的?
3,从外部输入的参数(新增数据)是不是只有一个参数被插入到USER表的BID列?
4,按照我的理解你是有两个表是么,一个原表,一个新表?
㈡ 在Sql Server触发器中判断操作是Insert还是Update还是Delete
DECLARE
@IsInsert bit,
@IsUpdate bit,
@IsDelete bit
IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted)
SET @IsInsert = 1
ELSE
SET @IsInsert = 0
IF EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
SET @IsUpdate = 1
ELSE
SET @IsUpdate = 0
IF NOT EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
SET @IsDelete = 1
ELSE
SET @IsDelete = 0
create trigger Update_Del on Table
for update,delete
as
if not exists(select 1 from inserted)
begin /*inserted表无记录,是删除*/
end
else
begin /*是更新*/ end
go
关键在于Inserted表
触发器语句中使用了两种特殊的表:deleted
表和 inserted 表。
Deleted
表用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted
表中。Deleted 表和触发器表通常没有相同的行。
Inserted
表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted
表和触发器表中。Inserted 表中的行是触发器表中新行的副本。
1.插入操作(Insert)
Inserted表有数据,Deleted表无数据
2.删除操作(Delete)
Inserted表无数据,Deleted表有数据
3.更新操作(Update)
Inserted表有数据(新数据),Deleted表有数据(旧数据)
㈢ mssql 触发器中使用判断
if (object_id('tr_insert', 'TR') is not null)
drop trigger tr_insert
GO
CREATE TRIGGER tr_insert
ON user
FOR insert
AS
DECLARE @AID, @BID, @CID INT;
SELECT @AID=AID,@BID=BID FROM INSERTED
IF EXISTS(SELECT 1 FROM user WHERE AID = @BID)
BEGIN
SELECT @CID=CID FROM user(UPDLOCK) WHERE AID = @BID
INSERT INTO user VALUES(@AID,@BID,@CID);
END
GO
㈣ SQL触发器判断总是为假
createtriggertri_InsertStudy
onStudyCourse_Table
forinsert--插入触发
as
begin
--定义变量
declare@idvarchar(10),@StuIDint,@TeaIDint,@CourseIDint,@tempvarchar(10),@countSumint;
--变量赋值
select@id=StudyID,@StuID=StuID,@TeaID=TeaID,@CourseID=CourseIDfrominserted;
select@countSum=count(StudyID)fromStudyCourse_TablewhereStudyID=@id;
if@idisnull
begin
select@id=left(newid(),10);
select2;
insertintoStudyCourse_Table(StudyID,StuID,TeaID,CourseID)values(@id,@StuID,@TeaID,@CourseID)
end
else
begin
if@countSum>1
begin
select3;
select@temp=left(newid(),10);
updateStudyCourse_TablesetStudyID=@temp,StuID=@StuID,TeaID=@TeaID,@CourseID=CourseID
whereStudyID=@idandStuID=@StuIDandTeaID=@TeaIDand@CourseID=CourseID;
end
else
begin
select1;
end
end
end
/*
上面是修改过的
上面的触发器存在问题,就是一次插入多条记录时,肯定会有问题,因为inserted本身是个结果集,除非你能保证这个表的数据都是一条一条的插入,而不是批量插入
批量插入的话需要另外一种写法。因为对你业务不了解,无法帮到你。
*/
㈤ 如何看sql 中的触发器触发了什么
1)查看表中的触发器类型:
sp_helptrigger:返回对当前数据库的指定表定义的 DML 触发器的类型。sp_helptrigger 不能用于 DDL 触发器。
示例: EXEC sp_helptrigger '表名'
2)查看触发器的有关信息:
sp_help:报告有关数据库对象(sys.sysobjects 兼容视图中列出的所有对象)、用户定义数据类型或某种数据类型的信息。
示例: EXEC sp_help '触发器名'
3)显示触发器的定义:
sp_helptext:显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文本。
示例: EXEC sp_helptext '触发器名'
4)查看当前库中所有的触发器:
查询脚本:SELECT * FROM Sysobjects WHERE xtype = 'TR'
5)查看当前库中所有的触发器和与之相对应的表:
查询脚本:SELECT tb2.name AS tableName,tb1.name AS triggerName FROM Sysobjects tb1 JOIN Sysobjects tb2 ON tb1.parent_obj=tb2.id WHERE tb1.type='TR'