Avatar billede wheeler Nybegynder
21. november 2004 - 10:00 Der er 5 kommentarer og
1 løsning

Syntax fejl på MS SQL 7.0

Jeg får en syntax fejl på "ON Delete Cascade" osv.

Incorrect syntax near the keyword 'ON'

Koden ser sådan ud og skal afvikles på en MS SQL 7.0.

ALTER TABLE [dbo].[xlaABMbanners] ADD
CONSTRAINT [FK_xlaABMbanners_xlaABMadvertisers] FOREIGN KEY
(
[advertiserid]
) REFERENCES [dbo].[xlaABMadvertisers] (
[advertiserid]
) ON DELETE CASCADE  ON UPDATE CASCADE
GO

Slettes ON DELETE CASCADE  ON UPDATE CASCADE vil koden gerne afvikles. Hvor er fejlen eller kan koden laves anderledes med samme effekt?
Avatar billede arne_v Ekspert
21. november 2004 - 11:52 #1
SQLServer 7.0 har ikke den feature.

Du bliver nødt til at lave triggers som laver det samme.
Avatar billede wheeler Nybegynder
22. november 2004 - 11:46 #2
Ved du tilfældigvis hvad de to triggers gør?
Avatar billede arne_v Ekspert
22. november 2004 - 11:58 #3
De skal jo lave CASCADE.

Hvis du vil se hvordan sådan nogen ser ud så prøv og upsize en lille
Access database med CASCADE til din SQLServer. Upsize wizard genererer
nemlig triggers.
Avatar billede arne_v Ekspert
12. december 2004 - 20:13 #4
OK ?
Avatar billede wheeler Nybegynder
13. december 2004 - 11:32 #5
Jeg fik svar på mit problemet, men jeg har ikke lige mulighed for at prøve via Access i vores databasemiljø. Så jeg ved ikke hvordan de skal se ud.
Avatar billede arne_v Ekspert
13. december 2004 - 23:03 #6
Her er et eksempel.

Klassiske tabel struktur:

CREATE TABLE [dbo].[postnr] (
    [postnr] [int] NOT NULL ,
    [by] [nvarchar] (50) NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[adresse] (
    [navn] [nvarchar] (50) NOT NULL ,
    [adresse] [nvarchar] (50) NULL ,
    [postnr] [int] NULL
) ON [PRIMARY]
GO

med triggers:

CREATE TRIGGER "postnr_UTrig" ON postnr FOR UPDATE AS
SET NOCOUNT ON
/* * CASCADE UPDATES TO 'adresse' */
IF UPDATE(postnr)
    BEGIN
      UPDATE adresse
      SET adresse.postnr = inserted.postnr
      FROM adresse, deleted, inserted
      WHERE deleted.postnr = adresse.postnr
    END

GO

CREATE TRIGGER "postnr_DTrig" ON postnr FOR DELETE AS
SET NOCOUNT ON
/* * CASCADE DELETES TO 'adresse' */
DELETE adresse FROM deleted, adresse WHERE deleted.postnr = adresse.postnr

GO

CREATE TRIGGER "adresse_UTrig" ON adresse FOR UPDATE AS
SET NOCOUNT ON
/* * PREVENT UPDATES IF NO MATCHING KEY IN 'postnr' */
IF UPDATE(postnr)
    BEGIN
        IF (SELECT COUNT(*) FROM inserted) !=
          (SELECT COUNT(*) FROM postnr, inserted WHERE (postnr.postnr = inserted.postnr))
            BEGIN
                RAISERROR 44446 'The record can''t be added or changed. Referential integrity rules require a related record in table ''postnr''.'
                ROLLBACK TRANSACTION
            END
    END

GO

CREATE TRIGGER "adresse_ITrig" ON adresse FOR INSERT AS
SET NOCOUNT ON
/* * PREVENT INSERTS IF NO MATCHING KEY IN 'postnr' */
IF (SELECT COUNT(*) FROM inserted) !=
  (SELECT COUNT(*) FROM postnr, inserted WHERE (postnr.postnr = inserted.postnr))
    BEGIN
        RAISERROR 44447 'The record can''t be added or changed. Referential integrity rules require a related record in table ''postnr''.'
        ROLLBACK TRANSACTION
    END

GO
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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