通过存储过程 创建动态触发器

来源:互联网 发布:贵阳软件人均工资 编辑:程序博客网 时间:2024/06/05 14:58
/*Author:BeanCreate date:2011-08-12问题描述1   :很多时候我们一个模板会有很多的表格,例如Care 项目,一共有29张表,想删除一条单据,  那么我们要写29条Delete语句问题描述2:如果不写触发器,很多时候只是_1表的数据被删除了,剩下的_2,_3,_4...表的数据还会存在数据库里浪费资源功能描述:主要用于Landa数据库单据删除,当删除_1表后,后面带动的_2,_3,_4...表相同VGUID的单据会被自动删除优点:快捷,方便使用案例:Exec Porc_AddTrigger '表名_1'   */if OBJECT_ID('Porc_AddTrigger','P') is not null  drop proc Porc_AddTriggergocreate Proc Porc_AddTrigger@TB_name varchar(50)asBeginBegin TransactionBegin Tryif RIGHT(@TB_name,2)!='_1'RaisError('Table name should end with "_1"',16,1)ElseBegindeclare @sql varchar(max)set @sql='create trigger TR_'+left(@TB_name,LEN(@TB_name)-2)+'on '+@TB_name+'for deleteasBegindeclare @TMP varchar(50),@i numeric(38,0),@table varchar(50),                @SQL varchar(max),@VGUID uniqueidentifierset @TMP='+''''+left(@TB_name,len(@TB_name)-1)+''''+'set @table=''CSEMPL_2''set @VGUID=newid()set @i=2select @VGUID=VGUID from deletedwhile 1=1Begin  set @table=@TMP+convert(varchar(10),@i) if OBJECT_ID(@table,''U'') is not null Begin   set @SQL=''delete from '' + @table +'' where VGUID ='''+'+''''''''+'+' convert(varchar(50),@VGUID)+'+''''''''''+'exec(@SQL)set @i=@i+1   End ElseBreak;   endEnd'Exec(@sql)EndCommit TransactionEnd TryBegin CatchRollback Transactiondeclare @Error_Message varchar(1000)set @Error_Message= 'Error_Nuber  :'+CONVERT(varchar(5),Error_Number())+char(13)+'Error_Line   :'+Convert(varchar(5),Error_Line())+char(13)+'Error_Message:'+CONVERT(varchar(50),Error_Message())RaisError(@Error_message,16,1)End CatchEnd