Jeg er ved at prøve på at lave en modificeret SQL trigger. Men jeg har lidt problemer med den, som jeg håber i ville kunne hjælpe med. Jeg aner nemlig intet om triggers endnu :\
Her er triggeren: USE [Part2_Zodiac] GO /****** Object: Trigger [dbo].[TriggerEquipCheck] Script Date: 02/20/2010 19:20:48 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO
ALTER TRIGGER [dbo].[TriggerEquipCheck] ON [dbo].[CharItem] INSTEAD of UPDATE AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON;
declare @CID int declare @prev varBinary(1440) declare @new varBinary(1440)
set @CID = (select CID from inserted) set @prev = (select Equip from deleted) set @new = (select Equip from inserted)
IF @new is NULL OR @prev = @new UPDATE CharItem SET Quick = i.Quick, Equip = @new, Inventory = i.Inventory, Extra = i.Extra FROM inserted i WHERE CharItem.CID = @CID ELSE Exec dbo.DisconnectCharacter @CID END
Det jeg skal have den til at gøre er at når noget bliver opdateret, så skal den checke om 'CID'et' eksistiere, hvis det ikke gør skal den bare opdatere som normalt, men hvis det eksistere skal den ikke indsætte det i databasen, og evt udføre denne: Exec dbo.DisconnectCharacter @CID.
Mit problem er nu, at den ikke gemmer opdateringer på noget overhovedet så snart jeg aktivere den.
Jeg kunne forestille mig det var dette "UPDATE CharItem SET Quick = i.Quick, Equip = @new, Inventory = i.Inventory, Extra = i.Extra FROM inserted i WHERE CharItem.CID = @CID" Som der er noget i vejen med. Jeg ved ikke om der er en eller anden kommando, som genoptager den normalle opdatering?
Selve triggeren, skal bruges som beskyttelse imod dublering af ting på en spil server. Håber der er nogen der kan hjælpe :-)
Jeg vil anbefale at lave en instead of insert, da dette er mere semantisk korrekt :) Og så bare lade updates være updates... men hmm nu her i skrivende stund, kommer lige i tanke om... Hvorfor ikke bare lave et unikt index og så på den måde undgå dubletter?
Som debugging kan man lige udskrive sine vars inden insert, altså:
ALTER TRIGGER [dbo].[TriggerEquipCheck] ON [dbo].[CharItem] INSTEAD of INSERT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements.
declare @CID int declare @prev varBinary(1440) declare @new varBinary(1440)
set @CID = (select CID from inserted) set @prev = (select Equip from deleted) set @new = (select Equip from inserted)
IF @new is NULL OR @prev = @new select @CID, @prev, @new ELSE select @CID, @prev, @new END
ALTER TRIGGER [dbo].[TriggerEquipCheck] ON [dbo].[CharItem] INSTEAD of INSERT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON;
declare @CID int declare @prev varBinary(1440) declare @new varBinary(1440)
set @CID = (select CID from inserted) set @prev = (select Equip from deleted) set @new = (select Equip from inserted)
IF @new is NULL OR @prev = @new select @CID, @prev, @new ELSE Exec dbo.DisconnectCharacter @CID END
Den går ind og blokerer for nogle andre ting, end den skal, hvorfor er jeg ikke helt sikker på.
Det jeg skal have den til, er kun at tjekke om ID'et eksistere i forvejen, hvis det ikke gør, skal den bare forsætte med at 'Inserte' det som den normalt ville. Hvis ikke skal den blokerer for det.
Men umiddelbart, skulle det også være det den gør, når den tjekker om @prev = @new, kan godt være jeg tager fejl, er stadig ikke helt inde i MSSQL :-)
Jeg vil hellere se hvad debuggingen skriver :) , kør denne her:
ALTER TRIGGER [dbo].[TriggerEquipCheck] ON [dbo].[CharItem] INSTEAD of INSERT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. --SET NOCOUNT ON;
declare @CID int declare @prev varBinary(1440) declare @new varBinary(1440)
set @CID = (select CID from inserted) set @prev = (select Equip from deleted) set @new = (select Equip from inserted)
select @CID, @prev, @new
END
Hvad gør denne her: Exec dbo.DisconnectCharacter @CID
Og fjern nocount imens du debugger.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.