/*
author :bean
create 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_addtrigger
gocreate proc porc_addtrigger
@tb_name varchar(50)
asbegin
begin transaction
begin try
if right(@tb_name,2)!='_1'
raiserror('table name should end with "_1"',16,1)
else
begin
declare
@sql varchar(max)
set @sql='
create trigger tr_'+left(@tb_name,len(@tb_name)-2)+'
on '+@tb_name+'
for delete
asbegin
declare @tmp varchar(50),
@i numeric(38,0),
@table varchar(50),
@sql varchar(max),
@vguid uniqueidentifier
set @tmp='+''''+left(@tb_name,len(@tb_name)-1)+''''+'
set @table=''csempl_2''
set @vguid=newid()
set @i=2
select @vguid=vguid from deleted
while 1=1
begin
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 else
break;
endend'
exec(@sql)
endcommit transaction
end try
begin catch
rollback transaction
declare @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 catch
end
觸發器 儲存過程
1 為productsales資料庫中的產品表建立乙個名為update pno的update觸發器,該觸發器的作用是禁止更新產品表中的 productname 欄位的內容。並用update語句修改產品表中第一條記錄為 1 hp1500 印表機 2000 要求顯示 不能修改產品名稱 的警告資訊。cre...
儲存過程 觸發器
觸發器主要是通過事件進行觸發而被執行的,而儲存過程可以通過儲存過程名字而被直接呼叫。當對某一表進行諸如update insert delete 這些操作時,就會自動執行觸發器所定義的sql 語句,從而確保對資料的處理必須符合由這些sql 語句所定義的規則。觸發器的主要作用就是其能夠實現由主鍵和外來鍵...
sql 觸發器 儲存過程 觸發器(3 3)
1 what?什麼是觸發器 trigger 前兩篇介紹了儲存過程,儲存過程可以理解為sql語句集。那麼觸發器就是一種特殊的儲存過程,也就是一群特殊的sql語句集。特殊在哪?從上文得知,儲存過程是依賴名字才被呼叫的。不僅是儲存過程,我們常用的方法等,大部分也是先知道名字,才能去使用。就像吃飯採用訂外賣...