`
jinyanliang
  • 浏览: 308023 次
  • 性别: Icon_minigender_1
  • 来自: 河南开封
社区版块
存档分类
最新评论

sql server2005 触发器例子

阅读更多

引用 session和cookie机制 sql server 2005触发器例子2
sql server2005 触发器例子

数据库 2009-10-26 15:36:00 阅读650 评论0   字号:大中小 订阅
===============================
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

-- =============================================
-- Author:  <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [TR_Lz_Week_BaseOil_Insert] ON [dbo].[Lz_Week_BaseOil]
FOR INSERT,UPDATE
AS

SET NOCOUNT ON
if update(yy) or Update(wk)

Begin
  update [lzlt].[dbo].[Lz_Week_BaseOil] set
  index_id=cast(I.yy as varchar) + right(cast(power(10,2) as varchar)+I.wk,2) + right(cast(power(10,9) as varchar)+I.id,9)
  from [lzlt].[dbo].[Lz_Week_BaseOil] P
  inner join Inserted I On P.Id = I.ID

Update [lzlt].[dbo].[Lz_Week_BaseOil]
Set  change_rate = P.price -
  (select top 1 price
   from [lzlt].[dbo].[Lz_Week_BaseOil] a
   where a.index_id<=P.index_id and a.lz_BaseOil_product_id=I.lz_BaseOil_product_id
   And a.ID<> I.ID
   Order by a.index_id Desc
  )
from [lzlt].[dbo].[Lz_Week_BaseOil] P
INNER JOIN Inserted AS I ON P.id=I.ID

--剔除错误数据
Update [lzlt].[dbo].[Lz_Week_BaseOil]
Set Change_rate=NULL
from [lzlt].[dbo].[Lz_Week_BaseOil] P
INNER JOIN Inserted AS I ON P.id=I.ID
Where (P.price + P.change_rate < 1) AND (P.price + P.change_rate > -1)

End
SET NOCOUNT OFF
/*
Update [lzlt].[dbo].[Lz_Week_BaseOil]
Set Change_rate=NULL
 
Where (price + change_rate < 1) AND (price + change_rate > -1)
*/


**************************************

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

-- =============================================
-- Author:  <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER  [TR_djjz_Update] ON [dbo].[djjz]
FOR Update
AS

SET NOCOUNT ON
Begin

If Update (wp_ggxh)
Begin
  Update [lzlt].[dbo].[djjzList]
  Set
  wp_ggxh = I.wp_ggxh
  from [lzlt].[dbo].[djjzList] P
  inner join Inserted I on I.[sid] = P.[sid]
End

End
SET NOCOUNT OFF

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

-- =============================================
-- Author:  <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [TR_djjz_deleted] ON [dbo].[djjz]
FOR delete
AS

SET NOCOUNT ON
Begin
delete from djjzList
Where sid in (select sid from deleted)

Update [lzlt].[dbo].[lz_Domestic_exfactory_product]
Set
isdjjz = 0
from [lzlt].[dbo].[lz_Domestic_exfactory_product] P
inner join deleted I on I.[product_id] = P.[product_id]
And P.[product_Model_Id]=I.[model_id]
/*
Update [lzlt].[dbo].[lz_DomesticMarketProduct]
Set
isdjjz = 0
from [lzlt].[dbo].[lz_DomesticMarketProduct] P
inner join deleted I on I.[product_id] = P.[product_id]
And P.[product_Model_Id]=I.[model_id]
*/
Update [lzlt].[dbo].[lz_International_market_product]
Set
isdjjz = 0
from [lzlt].[dbo].[lz_International_market_product] P
inner join deleted I on I.[product_id] = P.[product_id]
-- And P.[product_Model_Id]=I.[model_id]
/*
Update [lzlt].[dbo].[lz_DomesticMarketOilProduct]
Set
isdjjz = 0
from [lzlt].[dbo].[lz_DomesticMarketOilProduct] P
inner join deleted I on I.[product_id] = P.[product_id]
And P.[ProductModelID]=I.[model_id]
*/

End
SET NOCOUNT OFF

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

-- =============================================
-- Author:  <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [TR_djjzList_Insert] ON [dbo].[djjzList]
FOR INSERT,UPDATE
AS

SET NOCOUNT ON
if update(pricedate)

Begin
  update [lzlt].[dbo].[djjzList] set
  index_id=CONVERT(varchar(8) ,I.pricedate, 112) + Replace(CONVERT(varchar(20) ,getdate(), 108) ,':' ,'') +  right(cast(power(10,9) as varchar)+I.id,9)
  from [lzlt].[dbo].[djjzList] P
  inner join Inserted I On P.Id = I.ID

End
SET NOCOUNT OFF

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go



-- =============================================
-- Author:  <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [qq_delete_bopPrice]
   ON  [dbo].[lz_BaseOil_Price]
   FOR DELETE
AS
BEGIN
DECLARE @product_ID INT
DECLARE @price_date datetime

DECLARE @p_price_date datetime
DECLARE @p_price float

DECLARE @p_Change_Rate float

SET NOCOUNT ON;
/*
SET @price_date = (SELECT price_date FROM Deleted)
SET @product_ID = (SELECT lz_BaseOil_product_id FROM Deleted)

DECLARE @last_date datetime
set @last_date = ( select last_date from lz_BaseOil_product where lz_BaseOil_product_id=@product_ID)
If DateDiff(day,@last_date,@price_date)=0
Begin
  --查找相关数据进入游标  
  DECLARE TR_DELETE_lz_Domestic_exfactory_price_cursor CURSOR FOR
  SELECT TOP 1 price_date,price,Change_Rate FROM lz_BaseOil_Price
  WHERE lz_BaseOil_product_id =@product_id
  order by price_date desc
  OPEN TR_DELETE_lz_Domestic_exfactory_price_cursor

  FETCH NEXT FROM TR_DELETE_lz_Domestic_exfactory_price_cursor
  INTO @p_price_date,@p_price,@p_Change_Rate

  CLOSE TR_DELETE_lz_Domestic_exfactory_price_cursor
  DEALLOCATE TR_DELETE_lz_Domestic_exfactory_price_cursor
  --结束游标
  update lz_BaseOil_product set last_date=@p_price_date,last_price=@p_price, Last_change_Rate=@p_Change_Rate  where lz_BaseOil_product_id=@product_id
End
  --print @next_id
*/
Update lz_BaseOil_product set
last_date=(select top 1 price_date from lz_BaseOil_Price WHERE lz_BaseOil_product_id =I.lz_BaseOil_product_id and lz_BaseOil_Price_Id not in (select lz_BaseOil_Price_Id from Deleted ) order by price_date desc ),
last_price=(select top 1 price from lz_BaseOil_Price WHERE lz_BaseOil_product_id =I.lz_BaseOil_product_id and lz_BaseOil_Price_Id not in(select lz_BaseOil_Price_Id from deleted) order by price_date desc ),
Last_change_Rate=(select top 1 Change_Rate from lz_BaseOil_Price WHERE lz_BaseOil_product_id =I.lz_BaseOil_product_id and lz_BaseOil_Price_Id not in(select lz_BaseOil_Price_Id from deleted) order by price_date desc )
from lz_BaseOil_product P inner join Deleted I
ON P.lz_BaseOil_product_id = I.lz_BaseOil_product_id

SET NOCOUNT OFF;
END


\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\




set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go






ALTER TRIGGER [qq_insert_update_bop]
ON  [dbo].[lz_BaseOil_Price]
FOR INSERT,UPDATE
AS
DECLARE @current_date datetime --当前价格日期
DECLARE @product_id int --当前产品id
DECLARE @id int
DECLARE @next_id int
DECLARE @current_price decimal(18, 2) --当前价格
DECLARE @Previous_PRICE decimal(18, 2) --以前一个价格
DECLARE @memo nvarchar(500)
SET NOCOUNT ON
if update(price_date) or update(price)
Begin
  SET @id = (SELECT lz_BaseOil_Price_Id FROM Inserted)
  SET @current_date = (SELECT price_date FROM Inserted)
  SET @product_id = (SELECT lz_BaseOil_product_id FROM Inserted)
  SET @current_price = (SELECT  price FROM Inserted)
  SET @memo = (SELECT memo FROM Inserted)
  SET @Previous_PRICE = ( SELECT TOP 1  price FROM lz_baseOil_Price WHERE lz_BaseOil_product_id=@product_id and  DATEDIFF(day,price_date,@current_date)>0 order by price_date desc )

  SET @Previous_PRICE = isnull(@Previous_PRICE,@current_price)

  update lz_baseOil_Price set
  index_id=CONVERT(varchar(8) ,price_date, 112) + Replace(CONVERT(varchar(20) ,getdate(), 108) ,':' ,'') + right(cast(power(10,9) as varchar)+lz_BaseOil_Price_Id,9)
  ,change_Rate=@current_price-@Previous_PRICE where lz_BaseOil_Price_Id=@id

  set @next_id = ( SELECT TOP 1 lz_BaseOil_Price_Id FROM lz_baseOil_Price WHERE lz_BaseOil_product_id =@product_id and  DATEDIFF(day,price_date,@current_date)<0 order by price_date asc )
  
  if @next_id is not null
   Begin
    update lz_baseOil_Price set yesterday_price=@current_price,change_Rate=price-@current_price where lz_BaseOil_Price_Id=@next_id
   end
  DECLARE @last_date datetime
  set @last_date = ( select last_date from lz_BaseOil_product where lz_BaseOil_product_id=@product_id)
  If DateDiff(day,@last_date,@current_date)>=0
   Begin
    update lz_BaseOil_product set memo=@memo,last_date=@current_date,last_price=@current_price, Last_change_Rate=@current_price-@Previous_PRICE,modify_date=getdate() where lz_BaseOil_product_id=@product_id
   End
  Else
   Begin
    update lz_BaseOil_product set modify_date=getdate() where lz_BaseOil_product_id=@product_id
   End
  --print @next_id
End
SET NOCOUNT OFF




\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


ALTER TRIGGER [TR_DELETE_LZ_City] ON [dbo].[Lz_City]
FOR DELETE
AS
BEGIN
DECLARE @CityID INT
DECLARE @ParentID int

SET NOCOUNT ON;

SET @CityID = (SELECT CityID FROM Deleted)
SET @ParentID = (SELECT ParentID FROM Deleted)

If @ParentID > 0
Begin
  update [dbo].[LZ_City] set Child = Child - 1 Where CityID in (select CityID from [dbo].[GetLz_City_Parent](@ParentID))
End
SET NOCOUNT OFF;
END


\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

-- =============================================
-- Author:  <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [TR_UPDATE_LZ_City] ON [dbo].[Lz_City]
FOR UPDATE
AS
BEGIN
DECLARE @CityID int
DECLARE @ParentID int


DECLARE @f_CityID INT
DECLARE @f_ParentID int
DECLARE @f_ParentStr nvarchar(250)
DECLARE @f_Depth int
DECLARE @f_RootID int
DECLARE @f_Child int
DECLARE @f_orders int
DECLARE @f_ClassStr nvarchar(250)

SET NOCOUNT ON;

If Update(ParentID)
Begin
  DECLARE @ParentStr nvarchar(250)
  DECLARE @ClassStr nvarchar(250)
  DECLARE @OldParentStr nvarchar(250)
  DECLARE @OldParentID int
  DECLARE @OldDepth int
  DECLARE @Depth int
  DECLARE @Child int
  DECLARE @orders int
  DECLARE @RootID int
  SET @CityID = (SELECT CityID FROM Inserted)
  SET @ParentID = (SELECT ParentID FROM Inserted)
  SET @OldParentID = (SELECT OldParentID FROM Inserted)
  SET @OldParentStr = (SELECT ParentStr FROM Inserted)
  SET @OldDepth = (SELECT Depth FROM Inserted)
  SET @Child = (SELECT Child FROM Inserted)
  If @OldParentID<>@ParentID  --如果改变得了父ID
   Begin

    If @ParentID = 0
     Begin
      SET @RootID = @CityID
      SET @Depth = 0
      --set @ParentStr = ','+ CONVERT(varchar(10) ,@CityID) +','
      set @ParentStr = ''
      SET @orders = (SELECT IsNULL(max(orders),0) FROM [dbo].[LZ_City] where ParentID=@ParentID )
      Update [dbo].[LZ_City] SET OldParentID=@ParentID,ParentStr=',0,',Depth=0,RootID=@CityID,orders=@orders+1,classstr=','+CONVERT(varchar(10) ,@CityID)+','
      WHERE CityID=@CityID
     End
    Else
     Begin
      --@CityID,@ParentID,@ParentStr,@Depth,@RootID,@Child,@orders,@ClassStr

      --查找相关数据进入游标  
      DECLARE TR_INSERT_LZ_City_cursor CURSOR FOR
      SELECT Top 1 CityID,ParentID,ParentStr,Depth,RootID,Child,orders,ClassStr FROM [dbo].[LZ_City]
      WHERE CityID = @ParentID
      OPEN TR_INSERT_LZ_City_cursor

      FETCH NEXT FROM TR_INSERT_LZ_City_cursor
      INTO @f_CityID,@f_ParentID,@f_ParentStr,@f_Depth,@f_RootID,@f_Child,@f_orders,@f_ClassStr

      CLOSE TR_INSERT_LZ_City_cursor
      DEALLOCATE TR_INSERT_LZ_City_cursor
      --结束游标


      If @f_ParentStr=',0,'
       Begin
        set @ParentStr = ','+ CONVERT(varchar(10) ,@f_CityID) +','
       End
      Else
       Begin
        set @ParentStr =  @f_ParentStr + CONVERT(varchar(10) ,@f_CityID) + ','
       End
      SET @RootID = @f_RootID
      SET @Depth = @f_Depth+1
      SET @orders = (SELECT IsNULL(max(orders),0) FROM [dbo].[LZ_City] where ParentID=@ParentID )

      Update [dbo].[LZ_City] SET
      OldParentID=@ParentID,ParentStr=@ParentStr,Depth=@f_Depth+1,RootID=@f_RootID,orders=@orders+1,classstr=@f_ClassStr+CONVERT(varchar(10) ,@CityID)+','
      WHERE CityID=@CityID

     -- update [dbo].[LZ_City] set Child = Child + 1 Where CityID in (select CityID from [dbo].[GetLz_City_Parent](@ParentID))

     End

     If @Child > 0 --如果有子节点
      Begin
       If  @OldParentID = 0
        Begin
         Update [dbo].[LZ_City] set
         Depth=Depth + @Depth-@oldDepth,RootID=@RootID
         ,ParentStr=SUBSTRING(@ParentStr,1,len(@ParentStr)-1)+ParentStr
         ,classstr=SUBSTRING(@ParentStr,1,len(@ParentStr)-1)+classstr
         Where CityID in (select CityID from [dbo].[GetLz_City_GetChildren](@CityID))
        End
       Else
        Begin
         If @ParentID = 0
          Begin
           Update [dbo].[LZ_City] set
           Depth=Depth + @Depth-@oldDepth,RootID=@RootID
           ,ParentStr=','+replace(ParentStr,@oldParentStr,@ParentStr)
           ,classstr=','+replace(classstr,@oldParentStr,@ParentStr)
           Where CityID in (select CityID from [dbo].[GetLz_City_GetChildren](@CityID))
          End
         else
          Begin
           Update [dbo].[LZ_City] set
           Depth=Depth + @Depth-@oldDepth,RootID=@RootID
           ,ParentStr=replace(ParentStr,@oldParentStr,@ParentStr)
           ,classstr=replace(classstr,@oldParentStr,@ParentStr)
           Where CityID in (select CityID from [dbo].[GetLz_City_GetChildren](@CityID))
          end
        End
       update [dbo].[LZ_City] set Child = Child + @Child + 1 Where CityID in (select CityID from [dbo].[GetLz_City_Parent](@ParentID))
      End
     Else
      Begin
       update [dbo].[LZ_City] set Child = Child + 1 Where CityID in (select CityID from [dbo].[GetLz_City_Parent](@ParentID))
      end


     If  @OldParentID > 0
      Begin
       If @Child > 0 --如果有子节点
        Begin
         update [dbo].[LZ_City] set Child = Child - @Child -1 Where CityID in (select CityID from [dbo].[GetLz_City_Parent](@oldParentID))
        End
       Else
        Begin
         update [dbo].[LZ_City] set Child = Child - 1 Where CityID in (select CityID from [dbo].[GetLz_City_Parent](@oldParentID))
        End
      End
   end
End



If Update(AreaID)
Begin
  --区域更新
  update Lz_City set ProvId = NULL,CapiID = NULL,TownID = NULL ,AreaName=D.CityName,ProvName = NULL,CapiName = NULL,TownName = NULL
  FROM Lz_City
  INNER JOIN Inserted AS I ON Lz_City.CityId = I.CityId And Lz_City.Depth = 0
  INNER JOIN Lz_City AS D on I.AreaID = D.CityID
  -- 省份更新
 
  update Lz_City set ProvId = I.CityId,CapiID = NULL,TownID = NULL ,AreaName=D.CityName,ProvName = I.CityName,CapiName = NULL,TownName = NULL
  FROM Lz_City
  INNER JOIN Inserted AS I ON Lz_City.CityId = I.CityId And Lz_City.Depth = 1
  INNER JOIN Lz_City AS D on I.AreaID = D.CityID
 
  -- 市级更新
  update Lz_City set ProvId = I.ParentID,CapiID = I.CityID,TownID = NULL,AreaName=D.CityName,ProvName = B.CityName,CapiName = I.CityName,TownName = NULL
  From Lz_City
  INNER JOIN Inserted AS I ON Lz_City.CityId = I.CityId And Lz_City.Depth = 2
  INNER JOIN Lz_City AS B on Lz_City.ParentId = B.CityID
  INNER JOIN Lz_City AS D on I.AreaID = D.CityID
 
 
 
  -- 县级更新
  update Lz_City set ProvId = B.ParentId,CapiID = I.ParentID,TownID = I.CityID,AreaName=D.CityName,ProvName = C.CityName,CapiName = B.CityName,TownName = I.CityName
  From Lz_City
  INNER JOIN Inserted AS I ON Lz_City.CityId = I.CityId And Lz_City.Depth = 3
  INNER JOIN Lz_City AS B on Lz_City.ParentId = B.CityID
  INNER JOIN Lz_City AS C on B.ParentId = C.CityID
  INNER JOIN Lz_City AS D on I.AreaID = D.CityID

End
SET NOCOUNT OFF
END

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

-- =============================================
-- Author:  <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [TR_INSERT_LZ_City] ON [dbo].[Lz_City]
FOR INSERT
AS
DECLARE @CityID INT
DECLARE @ParentID int
DECLARE @ParentStr nvarchar(250)
DECLARE @orders int

DECLARE @f_CityID INT
DECLARE @f_ParentID int
DECLARE @f_ParentStr nvarchar(250)
DECLARE @f_Depth int
DECLARE @f_RootID int
DECLARE @f_AreaID int
DECLARE @f_Child int
DECLARE @f_orders int
DECLARE @f_ClassStr nvarchar(250)
DECLARE @Depth int

SET NOCOUNT ON

SET @CityID = (SELECT CityID FROM Inserted)
SET @ParentID = (SELECT ParentID FROM Inserted)


If @ParentID = 0
Begin
  SET @orders = (SELECT IsNULL(max(orders),0) FROM [dbo].[LZ_City] where ParentID=@ParentID )
  Update [dbo].[LZ_City] SET OldParentID=@ParentID,ParentStr=',0,',Depth=0,RootID=@CityID,AreaID=@CityID,orders=@orders+1,classstr=','+CONVERT(varchar(10) ,@CityID)+','
  WHERE CityID=@CityID
  Set @Depth = 0
End
Else
Begin
  --@CityID,@ParentID,@ParentStr,@Depth,@RootID,@Child,@orders,@ClassStr

  --查找相关数据进入游标  
  DECLARE TR_INSERT_LZ_City_cursor CURSOR FOR
  SELECT Top 1 CityID,ParentID,ParentStr,Depth,RootID,Child,orders,ClassStr,AreaID FROM [dbo].[LZ_City]
  WHERE CityID = @ParentID
  OPEN TR_INSERT_LZ_City_cursor

  FETCH NEXT FROM TR_INSERT_LZ_City_cursor
  INTO @f_CityID,@f_ParentID,@f_ParentStr,@f_Depth,@f_RootID,@f_Child,@f_orders,@f_ClassStr,@f_AreaID

  CLOSE TR_INSERT_LZ_City_cursor
  DEALLOCATE TR_INSERT_LZ_City_cursor
  --结束游标


  If @f_ParentStr=',0,'
   Begin
    set @ParentStr = ','+ CONVERT(varchar(10) ,@f_CityID) +','
   End
  Else
   Begin
    set @ParentStr =  @f_ParentStr + CONVERT(varchar(10) ,@f_CityID) + ','
   End
 
  SET @orders = (SELECT IsNULL(max(orders),0) FROM [dbo].[LZ_City] where ParentID=@ParentID )

  Update [dbo].[LZ_City] SET
  OldParentID=@ParentID,ParentStr=@ParentStr,Depth=@f_Depth+1,RootID=@f_RootID,AreaID=@f_AreaID,orders=@orders+1,classstr=@f_ClassStr+CONVERT(varchar(10) ,@CityID)+','
  WHERE CityID=@CityID
  set @Depth = @f_Depth+1
  update [dbo].[LZ_City] set Child = Child + 1 Where CityID in (select CityID from [dbo].[GetLz_City_Parent](@ParentID))

End

If @Depth=0
Begin

  --区域更新
  update Lz_City set ProvId = NULL,CapiID = NULL,TownID = NULL ,AreaName=D.CityName,ProvName = NULL,CapiName = NULL,TownName = NULL
  FROM Lz_City
  INNER JOIN Inserted AS I ON Lz_City.CityId = I.CityId
  INNER JOIN Lz_City AS D on Lz_City.AreaID = D.CityID
End

If @Depth=1
Begin
  -- 省份更新
 
  update Lz_City set ProvId = I.CityId,CapiID = NULL,TownID = NULL ,AreaName=D.CityName,ProvName = I.CityName,CapiName = NULL,TownName = NULL
  FROM Lz_City
  INNER JOIN Inserted AS I ON Lz_City.CityId = I.CityId
  INNER JOIN Lz_City AS D on Lz_City.AreaID = D.CityID
End
If @Depth=2
Begin
  -- 市级更新
  update Lz_City set ProvId = I.ParentID,CapiID = I.CityID,TownID = NULL,AreaName=D.CityName,ProvName = B.CityName,CapiName = I.CityName,TownName = NULL
  From Lz_City
  INNER JOIN Inserted AS I ON Lz_City.CityId = I.CityId
  INNER JOIN Lz_City AS B on Lz_City.ParentId = B.CityID
  INNER JOIN Lz_City AS D on Lz_City.AreaID = D.CityID
End
 
If @Depth=3
Begin
  -- 县级更新
  update Lz_City set ProvId = B.ParentId,CapiID = I.ParentID,TownID = I.CityID,AreaName=D.CityName,ProvName = C.CityName,CapiName = B.CityName,TownName = I.CityName
  From Lz_City
  INNER JOIN Inserted AS I ON Lz_City.CityId = I.CityId
  INNER JOIN Lz_City AS B on Lz_City.ParentId = B.CityID
  INNER JOIN Lz_City AS C on B.ParentId = C.CityID
  INNER JOIN Lz_City AS D on Lz_City.AreaID = D.CityID
End

SET NOCOUNT OFF

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go



-- =============================================
-- Author:  <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [TR_DELETE_LZ_Columns] ON [dbo].[LZ_Columns]
FOR DELETE
AS
BEGIN
DECLARE @ColumnID INT
DECLARE @ParentID int

SET NOCOUNT ON;

SET @ColumnID = (SELECT ColumnID FROM Deleted)
SET @ParentID = (SELECT ParentID FROM Deleted)

If @ParentID > 0
Begin
  update [dbo].[LZ_Columns] set Child = Child - 1 Where ColumnID in (select ColumnID from [dbo].[GetLz_Columns_Parent](@ParentID))
End
SET NOCOUNT OFF;
END



\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


-- =============================================
-- Author:  <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [TR_lz_Domestic_exfactory_price] ON [dbo].[lz_Domestic_exfactory_price]
FOR INSERT,UPDATE
AS
DECLARE @current_date datetime --当前价格日期
DECLARE @product_id int --当前产品id
DECLARE @id int
DECLARE @next_id int
DECLARE @current_price decimal(18, 2) --当前价格
DECLARE @Previous_PRICE decimal(18, 2) --以前一个价格
DECLARE @memo nvarchar(500)

SET NOCOUNT ON
if update(price_date) or update(exfactory_price)
Begin
  SET @id = (SELECT lz_Domestic_exfactory_price_id FROM Inserted)
  SET @current_date = (SELECT price_date FROM Inserted)
  SET @product_id = (SELECT lz_Domestic_exfactory_product_id FROM Inserted)
  SET @current_price = (SELECT exfactory_price FROM Inserted)
  SET @memo = (SELECT memo FROM Inserted)

  SET @Previous_PRICE = ( SELECT TOP 1 exfactory_price FROM lz_Domestic_exfactory_price WHERE lz_Domestic_exfactory_product_id =@product_id and  DATEDIFF(day,price_date,@current_date)>0 order by price_date desc )

  SET @Previous_PRICE = isnull(@Previous_PRICE,@current_price)
  update lz_Domestic_exfactory_price set
  index_id=CONVERT(varchar(8) ,price_date, 112) + Replace(CONVERT(varchar(20) ,getdate(), 108) ,':' ,'') + right(cast(power(10,9) as varchar)+lz_Domestic_exfactory_price_id,9)
  ,change_Rate=@current_price-@Previous_PRICE
  where lz_Domestic_exfactory_price_id=@id

  set @next_id = ( SELECT TOP 1 lz_Domestic_exfactory_price_id FROM lz_Domestic_exfactory_price WHERE lz_Domestic_exfactory_product_id =@product_id and  DATEDIFF(day,price_date,@current_date)<0 order by price_date asc )
  
  if @next_id is not null
   Begin
    update lz_Domestic_exfactory_price set change_Rate=exfactory_price-@current_price where lz_Domestic_exfactory_price_id=@next_id
   end
  DECLARE @last_date datetime
  set @last_date = ( select last_date from lz_Domestic_exfactory_product where lz_Domestic_exfactory_product_id=@product_id)
  If DateDiff(day,@last_date,@current_date)>=0
   Begin
    update lz_Domestic_exfactory_product set memo=@memo,last_date=@current_date,last_exfactory_price=@current_price, Last_change_Rate=@current_price-@Previous_PRICE,modify_date=getdate() where lz_Domestic_exfactory_product_id=@product_id
   End
  Else
   Begin
    update lz_Domestic_exfactory_product set modify_date=getdate() where lz_Domestic_exfactory_product_id=@product_id
   End
  --print @next_id
End
SET NOCOUNT OFF


\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

-- =============================================
-- Author:  <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [TR_DELETE_lz_Domestic_exfactory_price] ON [dbo].[lz_Domestic_exfactory_price]
FOR DELETE
AS
BEGIN
DECLARE @product_ID INT
DECLARE @price_date datetime

DECLARE @p_price_date datetime
DECLARE @p_exfactory_price float
DECLARE @p_Change_Rate int

SET NOCOUNT ON;
/*
SET @price_date = (SELECT price_date FROM Deleted)
SET @product_ID = (SELECT lz_Domestic_exfactory_product_id FROM Deleted)

DECLARE @last_date datetime
set @last_date = ( select last_date from lz_Domestic_exfactory_product where lz_Domestic_exfactory_product_id=@product_ID)
If DateDiff(day,@last_date,@price_date)=0
Begin
  --查找相关数据进入游标  
  DECLARE TR_DELETE_lz_Domestic_exfactory_price_cursor CURSOR FOR
  SELECT TOP 1 price_date,exfactory_price,Change_Rate FROM lz_Domestic_exfactory_price
  WHERE lz_Domestic_exfactory_product_id =@product_id
  order by price_date desc
  OPEN TR_DELETE_lz_Domestic_exfactory_price_cursor

  FETCH NEXT FROM TR_DELETE_lz_Domestic_exfactory_price_cursor
  INTO @p_price_date,@p_exfactory_price,@p_Change_Rate

  CLOSE TR_DELETE_lz_Domestic_exfactory_price_cursor
  DEALLOCATE TR_DELETE_lz_Domestic_exfactory_price_cursor
  --结束游标
  update lz_Domestic_exfactory_product set last_date=@p_price_date,last_exfactory_price=@p_exfactory_price, Last_change_Rate=@p_Change_Rate  where lz_Domestic_exfactory_product_id=@product_id
End
  --print @next_id

*/
Update lz_Domestic_exfactory_product set
last_date=(select top 1 price_date from lz_Domestic_exfactory_price WHERE lz_Domestic_exfactory_product_id =I.lz_Domestic_exfactory_product_id and lz_Domestic_exfactory_price_id not in (select lz_Domestic_exfactory_price_id from Deleted ) order by price_date desc ),
last_exfactory_price=(select top 1 exfactory_price from lz_Domestic_exfactory_price WHERE lz_Domestic_exfactory_product_id =I.lz_Domestic_exfactory_product_id and lz_Domestic_exfactory_price_id not in(select lz_Domestic_exfactory_price_id from deleted) order by price_date desc ),
Last_change_Rate=(select top 1 Change_Rate from lz_Domestic_exfactory_price WHERE lz_Domestic_exfactory_product_id =I.lz_Domestic_exfactory_product_id and lz_Domestic_exfactory_price_id not in(select lz_Domestic_exfactory_price_id from deleted) order by price_date desc )
from lz_Domestic_exfactory_product P inner join Deleted I
ON P.lz_Domestic_exfactory_product_id = I.lz_Domestic_exfactory_product_id

SET NOCOUNT OFF;
END

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

-- =============================================
-- Author:  <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [TR_lz_DataSupportMemo_Insert] ON [dbo].[lz_DataSupportMemo]
FOR INSERT,UPDATE
AS

SET NOCOUNT ON
if update(PostDate) Or Update (yy) or Update(MM)
Begin
  update [lzlt].[dbo].[lz_DataSupportMemo] set
  index_id=CONVERT(varchar(8) ,I.PostDate, 112) + cast(I.yy as varchar) + right(cast(power(10,2) as varchar)+I.mm,2) +  right(cast(power(10,9) as varchar)+I.id,9)
  from [lzlt].[dbo].[lz_DataSupportMemo] P
  inner join Inserted I On P.Id = I.ID

End
SET NOCOUNT OFF

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

-- =============================================
-- Author:  <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [TR_lz_DataSupport_deleted] ON [dbo].[lz_DataSupport]
FOR delete
AS

SET NOCOUNT ON
Begin
delete from lz_DataSupportMemo
Where sid in (select sid from deleted)

End
SET NOCOUNT OFF


\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\



set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

-- =============================================
-- Author:  <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [TR_UPDATE_LZ_Columns] ON [dbo].[LZ_Columns]
FOR UPDATE
AS
BEGIN
DECLARE @ColumnID int
DECLARE @ParentID int


DECLARE @f_ColumnID INT
DECLARE @f_ParentID int
DECLARE @f_ParentStr nvarchar(250)
DECLARE @f_Depth int
DECLARE @f_RootID int
DECLARE @f_Child int
DECLARE @f_orders int
DECLARE @f_ClassStr nvarchar(250)

SET NOCOUNT ON;

If Update(ParentID)
Begin
  DECLARE @ParentStr nvarchar(250)
  DECLARE @ClassStr nvarchar(250)
  DECLARE @OldParentStr nvarchar(250)
  DECLARE @OldParentID int
  DECLARE @OldDepth int
  DECLARE @Depth int
  DECLARE @Child int
  DECLARE @orders int
  DECLARE @RootID int
  SET @ColumnID = (SELECT ColumnID FROM Inserted)
  SET @ParentID = (SELECT ParentID FROM Inserted)
  SET @OldParentID = (SELECT OldParentID FROM Inserted)
  SET @OldParentStr = (SELECT ParentStr FROM Inserted)
  SET @OldDepth = (SELECT Depth FROM Inserted)
  SET @Child = (SELECT Child FROM Inserted)
  If @OldParentID<>@ParentID  --如果改变得了父ID
   Begin

    If @ParentID = 0
     Begin
      SET @RootID = @ColumnID
      SET @Depth = 0
      --set @ParentStr = ','+ CONVERT(varchar(10) ,@ColumnID) +','
      set @ParentStr = ''
      SET @orders = (SELECT IsNULL(max(orders),0) FROM [dbo].[LZ_Columns] where ParentID=@ParentID )
      Update [dbo].[LZ_Columns] SET OldParentID=@ParentID,ParentStr=',0,',Depth=0,RootID=@ColumnID,orders=@orders+1,classstr=','+CONVERT(varchar(10) ,@ColumnID)+','
      WHERE ColumnID=@ColumnID
     End
    Else
     Begin
      --@ColumnID,@ParentID,@ParentStr,@Depth,@RootID,@Child,@orders,@ClassStr

      --查找相关数据进入游标  
      DECLARE TR_INSERT_LZ_Columns_cursor CURSOR FOR
      SELECT Top 1 ColumnID,ParentID,ParentStr,Depth,RootID,Child,orders,ClassStr FROM [dbo].[LZ_Columns]
      WHERE ColumnID = @ParentID
      OPEN TR_INSERT_LZ_Columns_cursor

      FETCH NEXT FROM TR_INSERT_LZ_Columns_cursor
      INTO @f_ColumnID,@f_ParentID,@f_ParentStr,@f_Depth,@f_RootID,@f_Child,@f_orders,@f_ClassStr

      CLOSE TR_INSERT_LZ_Columns_cursor
      DEALLOCATE TR_INSERT_LZ_Columns_cursor
      --结束游标


      If @f_ParentStr=',0,'
       Begin
        set @ParentStr = ','+ CONVERT(varchar(10) ,@f_ColumnID) +','
       End
      Else
       Begin
        set @ParentStr =  @f_ParentStr + CONVERT(varchar(10) ,@f_ColumnID) + ','
       End
      SET @RootID = @f_RootID
      SET @Depth = @f_Depth+1
      SET @orders = (SELECT IsNULL(max(orders),0) FROM [dbo].[LZ_Columns] where ParentID=@ParentID )

      Update [dbo].[LZ_Columns] SET
      OldParentID=@ParentID,ParentStr=@ParentStr,Depth=@f_Depth+1,RootID=@f_RootID,orders=@orders+1,classstr=@f_ClassStr+CONVERT(varchar(10) ,@ColumnID)+','
      WHERE ColumnID=@ColumnID

     -- update [dbo].[LZ_Columns] set Child = Child + 1 Where ColumnID in (select ColumnID from [dbo].[GetLz_Columns_Parent](@ParentID))

     End

     If @Child > 0 --如果有子节点
      Begin
       If  @OldParentID = 0
        Begin
         Update [dbo].[LZ_Columns] set
         Depth=Depth + @Depth-@oldDepth,RootID=@RootID
         ,ParentStr=SUBSTRING(@ParentStr,1,len(@ParentStr)-1)+ParentStr
         ,classstr=SUBSTRING(@ParentStr,1,len(@ParentStr)-1)+classstr
         Where ColumnID in (select ColumnID from [dbo].[GetLz_Columns_GetChildren](@ColumnID))
        End
       Else
        Begin
         If @ParentID = 0
          Begin
           Update [dbo].[LZ_Columns] set
           Depth=Depth + @Depth-@oldDepth,RootID=@RootID
           ,ParentStr=','+replace(ParentStr,@oldParentStr,@ParentStr)
           ,classstr=','+replace(classstr,@oldParentStr,@ParentStr)
           Where ColumnID in (select ColumnID from [dbo].[GetLz_Columns_GetChildren](@ColumnID))
          End
         else
          Begin
           Update [dbo].[LZ_Columns] set
           Depth=Depth + @Depth-@oldDepth,RootID=@RootID
           ,ParentStr=replace(ParentStr,@oldParentStr,@ParentStr)
           ,classstr=replace(classstr,@oldParentStr,@ParentStr)
           Where ColumnID in (select ColumnID from [dbo].[GetLz_Columns_GetChildren](@ColumnID))
          end
        End
       update [dbo].[LZ_Columns] set Child = Child + @Child + 1 Where ColumnID in (select ColumnID from [dbo].[GetLz_Columns_Parent](@ParentID))
      End
     Else
      Begin
       update [dbo].[LZ_Columns] set Child = Child + 1 Where ColumnID in (select ColumnID from [dbo].[GetLz_Columns_Parent](@ParentID))
      end


     If  @OldParentID > 0
      Begin
       If @Child > 0 --如果有子节点
        Begin
         update [dbo].[LZ_Columns] set Child = Child - @Child -1 Where ColumnID in (select ColumnID from [dbo].[GetLz_Columns_Parent](@oldParentID))
        End
       Else
        Begin
         update [dbo].[LZ_Columns] set Child = Child - 1 Where ColumnID in (select ColumnID from [dbo].[GetLz_Columns_Parent](@oldParentID))
        End
      End
   end
End

SET NOCOUNT OFF
END
分享到:
评论

相关推荐

    sqlserver触发器例子

    ### SQL Server 触发器详解 #### 一、触发器概念 触发器是SQL Server中一种特殊的存储过程,其特点在于不能被显式地调用,而是当对特定表进行数据操作(如插入、更新或删除)时自动激活。通过这种方式,触发器能够...

    Sqlserver触发器例子

    Sqlserver 触发器例子 Sqlserver 触发器是指在 Sqlserver 数据库中,对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。常见的触发器有三种:分别应用于 Insert、Update、...

    SqlServer触发器调用WebService

    ### SqlServer触发器调用WebService知识点详解 #### 一、SqlServer触发器简介 在了解如何通过Sql Server触发器调用WebService之前,我们首先需要对触发器有一个基本的认识。触发器是一种特殊的存储过程,它被定义...

    sql server 2005第十二课(sql server触发器)

    总结,SQL Server 2005中的触发器是数据库设计的重要组成部分,它们提供了一种灵活的方式来处理数据变更时的复杂业务逻辑。理解并熟练使用触发器可以帮助开发者确保数据一致性,增强系统的功能,并提高数据管理的...

    SqlServer触发器写法案例

    ### SqlServer触发器详解与案例分析 #### 一、触发器概述 触发器是一种特殊类型的存储过程,它被定义为当特定的事件(如数据的插入、更新或删除)发生时自动执行。Sql Server 中的触发器可以用来强制业务规则或者...

    SqlServer触发器例子.pdf

    SqlServer触发器例子 SqlServer触发器是数据库系统中的一种特殊的存储过程,它可以在某一个表的一定操作时触发某种条件,从而执行一段程序。 SqlServer触发器可以应用于Insert、Update、Delete等事件。 触发器的...

    sql server触发器.rar

    SQL Server触发器是数据库管理系统中一种非常重要的特性,它允许开发者在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时执行自定义的SQL代码。这些操作被称为触发事件,而触发器则是对这些事件的响应。理解并...

    sqlserver 触发器 insert阿

    sqlserver 触发器 insert阿 一个关于触发器的小例子

    sqlserver 触发器学习(实现自动编号)

    在SQL Server中,触发器是一种特殊的存储过程,它在特定的数据库操作(如INSERT、UPDATE、DELETE)发生时自动执行,以实现复杂的数据完整性规则或业务逻辑。本篇将深入探讨触发器的基本概念、类型、分类及如何实现...

    新增用户就发送邮件和手机短信的SqlServer触发器

    根据给定的文件信息,我们可以深入探讨如何在SQL Server中创建一个触发器,该触发器在新用户添加到系统时自动发送电子邮件和短信通知。这一技术应用广泛于各种需要即时通知用户注册确认、账户激活或密码重置的场景中...

    关于SqlServer 触发器的PPT

    SQL Server的触发器是一种特殊的存储过程,它在特定的数据操作事件(INSERT、UPDATE或DELETE)发生时自动执行,用于扩展数据库系统的功能,实现更复杂的业务逻辑。触发器可以帮助确保数据完整性,实现级联操作,或者...

    浅谈SQL Server 2000触发器.pdf

    本文将详细介绍SQL Server 2000中触发器的类型、作用以及触发器的执行机制。 首先,触发器的主要作用包括: 1. 自动执行:触发器在数据库表中的数据发生变化之后立即被激活,无需手动调用。 2. 级联更改:触发器...

    SQL server 触发器,在触发Merge过程中,逐行触发的解决办法 用group by 避免是一次触发中的多行更新或删除。

    在SQL Server中,触发器是一种数据库对象,它可以在数据更改(INSERT、UPDATE或DELETE)时自动执行。在处理大量数据的Merge操作时,触发器可能会一次性处理多行,这可能导致性能问题或者不符合预期的行为。标题和...

    SQL Server 触发器 表的特定字段更新时,触发Update触发器

    在SQL Server中,触发器是一种特殊的存储过程,它在数据更改操作(如INSERT,UPDATE或DELETE)发生时自动执行。触发器可以用于实现复杂的业务规则和数据验证,以确保数据库中的数据完整性。在这个例子中,我们关注的...

    用sql脚本创建sqlserver数据库触发器范例语句

    在SQL Server中,数据库触发器是一种特殊的存储过程,它...这些示例对于学习和理解SQL Server触发器的功能和使用非常有帮助。在实际的数据库设计中,我们可以根据业务需求灵活地利用触发器来维护数据的一致性和完整性。

    SQL Server:触发器实例详解

    SQL Server中的触发器是数据库对象的一种,主要用于在特定的数据操作(如INSERT、UPDATE、DELETE)发生时自动执行一些额外的任务,以确保数据的完整性和一致性。触发器不能像普通存储过程那样被显式调用,而是隐式地...

    SQLSERVER2000数据库例子

    标题"SQLSERVER2000数据库例子"指的是这个压缩包包含的是SQL Server 2000的一些示例数据库,这些示例通常用于教学、学习和测试环境,帮助用户了解如何设计、创建和管理数据库。这些例子可以展示SQL Server 2000的...

    SQL Server嵌套触发器的设计.pdf

    SQL Server的嵌套触发器设计是一项复杂但至关重要的任务,特别是在维护数据完整性和一致性时。触发器是一种在数据库中预定义的程序,当特定的DML(数据操纵语言)操作,如INSERT、UPDATE或DELETE,发生在相关表上时...

Global site tag (gtag.js) - Google Analytics