[SQL] Ondersteunt MS SQL 7 dubbele "from" queries?

Pagina: 1
Acties:

  • porn*
  • Registratie: Januari 2001
  • Laatst online: 17-08 14:22

porn*

...take on the world!

Topicstarter
We zijn bezig met de ontwikkeling voor een site die op SQL7 moet gaan draaien, maar heb hier alleen SQL 2000 (=8.0) om te testen. Vervelend en onverstandig, dat weet ik, maar ik heb nou eenmaal geen andere versie beschikbaar.

Nu ben ik op een vervelende manier erachter gekomen dat cascaded updates en deletes niet ondersteund worden op SQL7, dus moet ik nu voor bijv. elk record dat verwijderd wordt gaan checken op constraints en deze handmatig verwijderen.

Klinkt lastig, is op zich niet zo moeilijk, omdat je in MS SQL "DELETE FROM FROM" queries kunt gebruiken. Voorbeeldje:

code:
1
2
3
4
DELETE FROM HBO_MBO 
FROM   HBO_MBO, MBO_OPL_SCHOOL
WHERE  MBO_OPL_SCHOOL.ID = HBO_MBO.ID_MBO_Opl AND
       MBO_OPL_SCHOOL.ID_School = x;


Oftewel, vervang de eerste 2 regels door "SELECT *" en hij verwijdert alle records uit de tabel HBO_MBO die aan de regels na "WHERE" gespecificeerd zijn. Werkt prima, in MS SQL 200 dus, maar werkt het ook in MS SQL 7?

Met Google kan ik niks vinden, en ook de GOT search lvert niks op. Is er iemand die dat weet of kan uitproberen?

[ Voor 12% gewijzigd door porn* op 15-10-2003 16:56 ]

Bnet pindle#2913


Verwijderd

Humz... uit me hoofd zeg ik 'ja', maar zo ben ik thuis achter me PC en zal ik nog is even kijken!

Verwijderd

Volgens mij wordt dat niet ondersteunt, ik heb het iig nog nooit gezien.

Cascading updates en Deletes kun je toch zo oplossen met Triggers. Daar zijn die dingen voor :D (o.a.)

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Uit de Sqlserver 7 BOL:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DELETE 
    [FROM ] 
        { 
         table_name WITH ( <table_hint_limited> [...n])
         | view_name
         | rowset_function_limited 
        }

        [ FROM {<table_source>} [,...n] ]

    [WHERE 
        { <search_condition> 
        |    { [ CURRENT OF 
                { 
                    { [ GLOBAL ] cursor_name } 
                    | cursor_variable_name 
                }
             ] 
        }
    ]
    [OPTION (<query_hint> [,...n])]


m.a.w.: JA. :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
porn schreef op 15 October 2003 @ 16:55:
Nu ben ik op een vervelende manier erachter gekomen dat cascaded updates en deletes niet ondersteund worden op SQL7, dus moet ik nu voor bijv. elk record dat verwijderd wordt gaan checken op constraints en deze handmatig verwijderen.
Dit kan je doen mbhv een INSTEAD OF DELETE trigger op je tabel.
Als je dan een delete statement op die tabel utivoert, dan wordt je INSTEAD OF TRIGGER uitgevoerd.
Daarin kan je dus eerst alle gerelateerde records verwijderen, en dan het record uit de tabel zelf verwijderen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TRIGGER dosomething ON tabel INSTEAD OF DELETE
AS
BEGIN

  DELETE rel_tabel
  FROM deleted  
  WHERE rel_tabel.foreign_key_id = deleted.id

  DELETE tabel
  FROM deleted
  WHERE tabel.primkeyid = deleted.id

END

Uit de losse pols, dus de syntax kan wel wat anders zijn. :P

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
SQLServer 7 support geen instead of triggers :P

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
kut.

En als ik het goed heb, dan kan je in SQL Server ook geen BEFORE triggers definieren.
Hoe kan je dan op een nette manier cascading deletes in SQL Server 7 definieren?

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
whoami schreef op 15 October 2003 @ 20:26:
kut.

En als ik het goed heb, dan kan je in SQL Server ook geen BEFORE triggers definieren.
Hoe kan je dan op een nette manier cascading deletes in SQL Server 7 definieren?
Niet. Alleen via een stored proc of gewoon op de normale manier: handmatig. SqlServer 7 is een behoorlijke bout-database hoor, vergis je niet. :)

BEFORE triggers zijn inderdaad ook een groot gemis. Geen idee of die er komen in Yukon, maar Yukon duurt sowieso tot eind 2004/begin 2005...

offtopic:
Whoami is de laatste tijd wel erg 'trigger'-happy
:+

[ Voor 7% gewijzigd door EfBe op 15-10-2003 20:38 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
EfBe schreef op 15 oktober 2003 @ 20:37:
[...]

Niet. Alleen via een stored proc of gewoon op de normale manier: handmatig. SqlServer 7 is een behoorlijke bout-database hoor, vergis je niet. :)
Bah, ugly.
Aan de andere kant, als je zowiezo voor al je DB access gebruik maakt van SP's, dan valt dat nog mee.
Echter, als je DB model wijzigt, dan kan je wellicht tegen onverwachte dingen aanlopen als je niet al je SP's nagelopen hebt.
BEFORE triggers zijn inderdaad ook een groot gemis. Geen idee of die er komen in Yukon, maar Yukon duurt sowieso tot eind 2004/begin 2005...
Ik hoop het. :P
offtopic:
Whoami is de laatste tijd wel erg 'trigger'-happy
:+
:D
In dat andere topic was de vraag dan ook expliciet 'hoe kan ik dat doen zonder aan m'n Java code te raken'.
Ik veronderstel dan ook dat z'n INSERT in z'n java code staat. :P

https://fgheysels.github.io/


  • porn*
  • Registratie: Januari 2001
  • Laatst online: 17-08 14:22

porn*

...take on the world!

Topicstarter
Nou mensen, ik heb het maar handmatig opgelost. Maar goed ook zie ik, want er is dus (naast stored procs) geen andere manier.

SQL7 is gewoon totaal verouderd, maja da's weer een goede les voor de volgende keer: SQL dan extra tijd berekenen voor het handwerk dat je extra moet verrichten.

Iig bedankt voor de reacties mensen!

Bnet pindle#2913


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Erm.. sqlserver 7 ondersteunt dus wel 2 FROM clauses in de delete. Dat had je wellicht kunnen gebruiken dus.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
EfBe schreef op 20 October 2003 @ 22:32:
Erm.. sqlserver 7 ondersteunt dus wel 2 FROM clauses in de delete. Dat had je wellicht kunnen gebruiken dus.
Is het niet zo dat er dan toch slechts records uit de eerste from worden gedeleted, en dat je die 2de from kunt gebruiken om andere tabellen te joinen, om zo de te deleten records te kunnen terugvinden.
damn, wat een zin. :+

zo dus:
code:
1
2
3
4
DELETE tblPublicaties
FROM tblAuteurs
WHERE tblAuteurs.AutId = tblPublicaties.AutId
AND tblAuteurs.Naam = 'blaat'

:?

En dat hierdoor enkel records uit tblPublicaties verwijderd worden?

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
whoami schreef op 20 oktober 2003 @ 22:35:
Is het niet zo dat er dan toch slechts records uit de eerste from worden gedeleted, en dat je die 2de from kunt gebruiken om andere tabellen te joinen, om zo de te deleten records te kunnen terugvinden.
precies. De 2e FROM kun je gebruiken voor een where predicate die meerdere tables omvat. Je kunt nooit rows uit meerdere tables tegelijk deleten met een delete statement.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1