webForumDet fria alternativet

Felmeddelande pga view

Databaser & SQLur Databashanterare & SQL

15 svar · 223 visningar · startad av Gimbo

Medlem sedan dec. 20001 626 inlägg
Frågan#1

jag har satt ihop några taller i till en view (MS SQL) och att hämta deta från denna view är inga problem men när jag ska uppdatera den eller lägga till en post så får jag detta felmeddelande:

View or function 'userlogin_contact' is not updatable because the modification affects multiple base tables.

Någon som vet hur man kan uppdatera denna view?? eller hur jag ska ta mig åt för att kunna uppdatera posterna??

Medlem sedan dec. 200012 464 inlägg
#2

Alla vyer är inte direkt uppdaterbara. En anledning, som i ditt fall, är att den är baserad på flera tabeller.

Den möjlighet som finns är att skapa en instead-of trigger där man själv uppdaterar de ingående tabellerna.

Medlem sedan dec. 20001 626 inlägg
#3

och hur gör man detta?? dvs måste man öppna databasen och uppdatera det manuellt??? eller fungerar det med att exekvera sql på webben??

Medlem sedan dec. 200012 464 inlägg
#4

Efter det att man skapat sin trigger är det inget manuellt handhavande.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_create2_7eeq.asp

Medlem sedan dec. 20001 626 inlägg
#5

får det inte att fungera:


CREATE TRIGGER userlogin_contact 
ON { userlogin_contact } 
[ WITH ENCRYPTION ] 
{ 
    { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } 
        [ WITH APPEND ] 
        [ NOT FOR REPLICATION ] 
        AS 
        [ { IF UPDATE ( column ) 
            [ { AND | OR } UPDATE ( column ) ] 
                [ ...n ] 
        | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask ) 
                { comparison_operator } column_bitmask [ ...n ] 
        } ] 
        sql_statement [conn.execute "UPDATE userlogin_contact SET customerID = 

'"&Request.Form("partnerID")&"', password = '"&Request.Form("Password")&"', 

First_name = '"&Request.Form("firstname")&"', Last_name = 

'"&Request.Form("lastname")&"', email = '"&Request.Form("email")&"' WHERE customerID 

= '" &Request.Form("partnerIDHidden")& "' "] 
    } 
}

om det är nu så man ska göra?

Medlem sedan dec. 200012 464 inlägg
#6

Det är inte riktigt så det ser ut. En förutsättning är att alla primärnyckelskolumner från de ingående tabellerna ingår i vyn.

En instead of trigger är något som utförs i stället för en operation på en tabell. I triggern har man tillgång till de poster som har förändrats i tabellen inserted som har samma kolumner som finns i vyn. Det kan se ut så här

create trigger updateJoinView on userlogin_contact
instead of update 
as

begin
  update contact
       set contactColumn1 = inserted.contactColumn1,
             contactColumn2 = inserted.contactColumn2
 from contact c,inserted i
 where c.contactPKColumn = i.contactPKColumn

update userlogin
       set loginColumn1 = inserted.loginColumn1,
             loginColumn2 = inserted.loginColumn2
 from userlogin u,inserted i
 where u.userloginPKColumn = i.userloginPKColumn
Medlem sedan dec. 20001 626 inlägg
#7

column1 och column2 är det namn på mina kolumner som skall uppdateras eller?
och vad är PKColumn för något?

Medlem sedan dec. 20001 626 inlägg
#8

en fråga till, vart skriver jag sql satsen?? med vilkoren på vilka kolumner som skall uppdateras??

Medlem sedan dec. 200012 464 inlägg
#9

Ja column1 och column2 är de kolumner som du vill uppdatera i respektive tabell. xxxPKColumn är den eller de kolumner som utgör primärnyckel i tabellerna.

Update gör du som vanligt, dvs som det såg ut från början

Medlem sedan dec. 20001 626 inlägg
#10
[b]create trigger updateJoinView on userlogin_contact[/b]
instead of update 
as

begin
  update contact
       set contactFirst_Name = inserted.contactFirst_Name,
             contactLast_Name = inserted.contactLast_Name
	   contactemail = inserted.contactemail
 from contact c,inserted i
 where c.contactID = i.contactID

update userlogin
       set logincustomerId = inserted.customerId,
             password = inserted.password
 from userlogin u,inserted i
 where u.userloginUID = i.userloginUID

conn.execute "UPDATE userlogin_contact SET " &_
" customerID = '"&Request.Form("partnerID")&"'," &_
" password = '"&Request.Form("Password")&"', " &_
" First_name = '"&Request.Form("firstname")&"', "&_
" Last_name = '"&Request.Form("lastname")&"', " &_
" email = '"&Request.Form("email")&"' " &_
" WHERE customerID = '" &Request.Form("partnerIDHidden")& "' "

får felmeddelandet:
Expected end of statement

på den fetmarkerade raden

Medlem sedan dec. 200012 464 inlägg
#11

Att skapa triggern är något du gör en gång i något verktyg som Enterprise Manager, inte i ASP.

Medlem sedan dec. 20001 626 inlägg
#12

men???? vad är koden till för då??? är den till för att skapa triggern i verktyget i enterprise manager??? eller är den till för att använda efter att triggern är skapad??

Medlem sedan dec. 200012 464 inlägg
#13

Det är bara för att skapa triggern. Den behöver bara skapas en gång och sedan så anropar SQL server den koden när man gör update på vyn.

Medlem sedan dec. 20001 626 inlägg
#14

oki, har du någon som helst aning var i enterprise man åstadkommer detta??

Medlem sedan dec. 200012 464 inlägg
#15

Nej, men det måste finnas något fönster där man kan mata in SQL-kod och utföra den.

Medlem sedan mars 2003772 inlägg
#16

Högerklicka på tabellen där du vill skapa triggern, sen tar du All Tasks och Manage Triggers. Koden skriver du bara in en gång sen kommer den anropas automatiskt då nånting Adderas, Raderas eller Uppdateras. Det väljer du själv.

Ett väldigt enkelt exempel där alla Underkategorier raderas automatiskt som var relaterade till en Huvudkategori som just blivit raderad skulle se ut såhär.

CREATE TRIGGER TR_HuvudKategori ON HuvudKategori FOR DELETE
AS
BEGIN
DELETE FROM UnderKategori WHERE UnderKategori.UnderCat in(SELECT HuvudCat FROM deleted)
END
134 ms totalt · 3 externa anrop · v20260731065814-full.55e59744
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)