Avatar billede rust10 Nybegynder
08. april 2004 - 14:18 Der er 1 kommentar og
1 løsning

insert trigger i et view

Jeg havde en database med to tabeller tblProjects og tblCustomers, den var desværre sat op som at et projekt kunne kun have 1 customer, men 1 customer kunne være på mange projekter.

Jeg fandt så ud af at jeg skulle faktisk have det så der var en mange til mange relation imellem disse to tabeller, og derfor oprettede jeg en tabel imellem disse to som jeg kaldte tblProjectMembers, som indeholdte ProjectID fra tblProjects, og CustomerID fra tblCustomers. Og jeg sletter så Customer attributten i tblProjects.

Senere finder jeg så ud af at det jo selvfølgeligt er lidt noget lort for de gamle programmer der benytter disse tabeller. Så jeg tilføjer en en integer kolonne i tblProjectMembers som jeg kalder Ranking, den skulle så beskrive den Customer som de gamle programmer skulle få fat i, når de forsøger at selecte ud fra den tabel, og kun forventer at der er 1 Customer tilknyttet hvert Project.

Så har jeg lavet et view som disse gamle programmer skulle kunne benytte sig af, og så derfor ikke bemærke mine ændringer.

CREATE VIEW tblProjectsvw
AS
SELECT    tblProjects.ProjectID,
    tblProjects.ProjectName,
    tblProjects.ProjectDesciption,
    tblProjectMembers.CustomerID,
    tblProjects.ProjectStartDate,
    tblProjects.ProjectEndDate,
    tblProjects.ProjectNumber,
    tblProjects.ProjectReferenceNumber,
    tblProjects.ProjectPriority,
    tblProjects.ProjectExclude
FROM     tblProjects, tblProjectMembers
WHERE  tblProjects.ProjectID=tblProjectMembers.ProjectID and
    tblProjectMembers.Ranking = 1

Det virker kanon når man bare selecter, men går i lort når jeg vil inserte med følgende besked.

Server: Msg 4405, Level 16, State 2, Line 1
View or function 'tblProjectsvw' is not updatable because the modification affects multiple base tables.

Så læste jeg mig frem til at man opretter en "Instead of trigger" til at løse dette problem, den har jeg forsøgt at lave sådan:

CREATE TRIGGER INSERT_TBLPROJECTS
ON tblProjectsvw
INSTEAD OF INSERT
AS
  INSERT INTO tblProjects VALUES (ProjectName,ProjectDesciption,ProjectStartDate,ProjectEndDate,ProjectNumber,ProjectReferenceNumber,ProjectPriority,ProjectExclude)
  INSERT INTO tblProjectMembers VALUES('4',CustomerID,'1')
GO

og får følgende fejl nu:
Server: Msg 128, Level 15, State 1, Procedure INSERT_TBLPROJECTS, Line 5
The name 'ProjectName' is not permitted in this context. Only constants, expressions, or variables allowed here. Column names are not permitted.

Nogen der kan fortælle mig hvordan jeg får det her til at fungere?
Avatar billede trer Nybegynder
08. april 2004 - 15:43 #1
Du skal læse fra skyggetabellen INSERTED for at få de data du har indsat. Det er en virtuel tabel der indeholder de kolonner der findes i dit view. 

Din kode kommer så til at se ud i denne dur:

CREATE TRIGGER INSERT_TBLPROJECTS
ON tblProjectsvw
INSTEAD OF INSERT
AS
  INSERT INTO tblProjects
  SELECT projectName, ProjectDesciption, ProjectStartDate, ProjectEndDate, ProjectNumber, ProjectReferenceNumber, ProjectPriority, ProjectExclude
  FROM inserted

  INSERT INTO tblProjectMembers SELECT 4,CustomerID, '1'
  FROM inserted
GO
Avatar billede rust10 Nybegynder
08. april 2004 - 20:43 #2
det virker jo!
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