Avatar billede Chup Nybegynder
20. februar 2010 - 19:58 Der er 5 kommentarer

SQL trigger

Halløjsa,

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 :-)

Tak på forhånd,
Chup
Avatar billede janus_007 Nybegynder
20. februar 2010 - 21:03 #1
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?

Eller skal vi fortsætte med trigger?
Avatar billede Chup Nybegynder
20. februar 2010 - 21:20 #2
Det kan godt være det er bedst ved insert, det lyder vist mere rigtigt ja.

Jeg vil helst fortsætte med trigger, da jeg er bange for det ikke vil virke, hvis jeg begynder at ændre på databaserne.

Tak for hurtigt svar :-)
Avatar billede janus_007 Nybegynder
21. februar 2010 - 01:26 #3
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
Avatar billede Chup Nybegynder
22. februar 2010 - 12:55 #4
Jeg har prøvet at køre med denne:

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 :-)
Avatar billede janus_007 Nybegynder
22. februar 2010 - 19:01 #5
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester