Sql 更新触发器获取更新的主键

Sql 更新触发器获取更新的主键,sql,sql-server,Sql,Sql Server,我有一个触发器,但我需要获取更新记录的主键,就像插入数据一样选择@Id=@@IDENTITY,这样我就可以将它传递到where条件。我该怎么做 ALTER TRIGGER [dbo].[CariBakiyeBorcAktar] ON [dbo].[BakimKartiDegisenParcalar] AFTER UPDATE AS BEGIN -- SET NOCOUNT ON added to prevent extra re

我有一个触发器,但我需要获取更新记录的主键,就像插入数据一样选择@Id=@@IDENTITY,这样我就可以将它传递到where条件。我该怎么做

ALTER TRIGGER [dbo].[CariBakiyeBorcAktar]
       ON  [dbo].[BakimKartiDegisenParcalar]
       AFTER   UPDATE
    AS 
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;

    DECLARE @Id int 
    DECLARE @CariId int 
    DECLARE @SId int 
    DECLARE @MId int
    declare @Tutar decimal
    declare @Bakiye decimal
    declare @s decimal = 0


    DECLARE @ParcaId int 


    --how I can I get the last updateed record Identity like this??
    --and pass it to update query as a where condition
    SELECT @Id= @@IDENTITY




    set @SId=(select SId from CariBakiye where Id =@Id)

    select @CariId=tblk.CariId ,@MId=tblk.MId, @SId= tblk.SId,@Tutar=tblk.Tutar from (
    SELECT tbl.CariId , tbl.MId,tbl.SId,tbl.Tutar from (select cb.MId,SUM(bk.Tutar) as  Tutar,bk.SId,cb.Id  as CariId FROM [BakimKartiDegisenParcalar] bk
    join  CariBakiye cb on cb.SId=bk.SId
     where bk.SId  =cb.SId group by bk.SId,cb.MId,cb.Id ) as tbl 
    ) as tblk  where SId = @SId

    set @Bakiye = @s-@Tutar


    update CariBakiye set Borc=@Tutar,Bakiye=@Bakiye where Id=@CariId

    print @Id
        -- Insert statements for trigger here

    END

正如Martin所说,您必须理解SQL Server触发器是每个语句,而不是每行。所以,在触发器的上下文中,有两个表-,您可以在其中找到有关更新数据的所有信息。如果确实要执行每行处理,可以使用游标:

ALTER TRIGGER [dbo].[CariBakiyeBorcAktar] ON  [dbo].[BakimKartiDegisenParcalar]
AFTER UPDATE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @Id int 
    DECLARE @CariId int 
    DECLARE @SId int 
    DECLARE @MId int
    declare @Tutar decimal
    declare @Bakiye decimal
    declare @s decimal = 0

    DECLARE @ParcaId int 


    declare tr_cursor cursor local fast_forward for
        select ID from inserted

    while 1 = 1
    begin
        fetch tr_cursor into @Id
        if @@fetch_status <> 0 break

        set @SId=(select SId from CariBakiye where Id =@Id)

        select @CariId=tblk.CariId ,@MId=tblk.MId, @SId= tblk.SId,@Tutar=tblk.Tutar from (
        SELECT tbl.CariId , tbl.MId,tbl.SId,tbl.Tutar from (select cb.MId,SUM(bk.Tutar) as  Tutar,bk.SId,cb.Id  as CariId FROM [BakimKartiDegisenParcalar] bk
        join  CariBakiye cb on cb.SId=bk.SId
         where bk.SId  =cb.SId group by bk.SId,cb.MId,cb.Id ) as tbl 
        ) as tblk  where SId = @SId

        set @Bakiye = @s-@Tutar


        update CariBakiye set Borc=@Tutar,Bakiye=@Bakiye where Id=@CariId

        print @Id
            -- Insert statements for trigger here
    end
    close tr_cursor
    deallocate tr_cursor
END

这个扳机坏得很厉害。在SQL Server中,触发器是按语句而不是按行激发的,因此可以更新多行。您需要使用引用插入/删除表的基于集合的语句重写它而不是@@identityummm,有任何修复建议吗?我已经给了您一个建议。但我并不打算为你做这件事。我有两个表,当更新第一个表的行时,试图触发触发器来更新我插入的第二个表中的行,似乎使用了游标redandance,你有什么建议,我应该使用inserted和deleted,但在这种情况下,我已经插入了行,如何使用inserted。我只是想了解tiger逻辑,我对这个话题是新手。再次谢谢你。你想让我为你写触发器吗?