Sql 更新触发器获取更新的主键
我有一个触发器,但我需要获取更新记录的主键,就像插入数据一样选择@Id=@@IDENTITY,这样我就可以将它传递到where条件。我该怎么做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
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逻辑,我对这个话题是新手。再次谢谢你。你想让我为你写触发器吗?