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.
Databaser & SQLur Databashanterare & SQL
15 svar · 223 visningar · startad av Gimbo
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??
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.
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??
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
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?
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
column1 och column2 är det namn på mina kolumner som skall uppdateras eller?
och vad är PKColumn för något?
en fråga till, vart skriver jag sql satsen?? med vilkoren på vilka kolumner som skall uppdateras??
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
[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
Att skapa triggern är något du gör en gång i något verktyg som Enterprise Manager, inte i ASP.
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??
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.
oki, har du någon som helst aning var i enterprise man åstadkommer detta??
Nej, men det måste finnas något fönster där man kan mata in SQL-kod och utföra den.
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