Nalezena vážná chyba v Microsoft SQL 7.0

13. dubna 1999
Computer 7/99 SDÍLET NA FACEBOOKU TWEETNOUT
Jeden z našich čtenářů nalezl vážnou chybu v Microsoft SQL 7.0, která způsobuje, že za určitých okolností vrací dotazy chybné výsledky. Ukážeme to.
Peter Polanský: V databázovej aplikácií Microsoft SQL Server 7.0 sa nachádza veľmi závažná chyba. Táto chyba spôsobuje, že za určitých okolnosti, sú výsledky SQL dotazu nesprávne. To môže mať v niektorých prípadoch katastrofálne dôsledky.

Na demonštráciu tejto závažnej chyby použijeme databázu, určenú na správu údajov v predajni automobilov. V databáze zaznamenávame nasledujúce informácie o automobiloch : model auta , počet dverí, farba karosérie a farba sedadiel.

Model databázy vyzerá nasledovne.

V tabuľka automobile sú stĺpce :

  • Model - názov a typ
  • Doors - počet dverí
  • body_color_id - farba karosérie ako identifikátor farby z tabuľky color
  • Seat_color_id - farba sedadiel ako identifikátor farby z tabuľky color

a v tabuľke color stĺpce :

  • id - identifikátor farby
  • color - názov farby.

Predpokladajme, že v predajni máme tieto 3 automobily.

  • štvordverový Cadillac DeVille Concours s čiernou karosériou a čiernymi sedadlami.
  • štvordverové BMW 740 il so striebornou karosériou a so striebornými sedadlami
  • dvojdverový Mercedes-Benz CLK320 Cabriolet s červenou karosériou a striebornými sedadlami
Obsah tabuliek automobil a color bude potom nasledovný:

V snahe zrýchliť vykonávanie dotazov vytvoríme index na stĺpec body_color_id v tabuľke automobile a na stĺpec id v tabuľke color.

CREATE  UNIQUE  CLUSTERED  INDEX pk_model_id ON automobile(body_color_id)
GO

CREATE INDEX idx_color_id ON color(id)
GO

Poznámka : Index pk_model_id na stĺpec body_color_id v tabuľke automobile je unikátny, čo možno postráda zmysel, avšak pre účel demonštrácie chyby to nie je podstatné

Predpokladajme, že zákazník požaduje štvordverový automobil s čiernou karosériou a s čiernymi sedadlami. Túto požiadavku pretransformujeme do následovného SQL dotazu.

SELECT   automobile.model
FROM
color , automobile
WHERE
( color.color = 'black' ) and
( automobile.body_color_id = color.id ) and
( automobile.body_color_id = automobile.seat_color_id ) and
( automobile.doors = 4 )
GO

Výsledok dotazu je automobil Cadillac DeVille Concours, ktorý spĺňa podmienky dotazu.( má štvoro dverí, čiernu karosériu aj čierne sedadla)

Result :
=============================================
model
--------------------------------
Cadillac DeVille Concours

(1 row(s) affected)

V snahe zoptimalizovať dotaz vytvoríme index na stĺpec doors v tabuľku automobile.

CREATE INDEX idx_automobile_doors ON automobile(doors) 
GO

Zadajme teraz ten istý SQL dotaz.( na štvordverový automobil s čiernou karosériou a čiernymi sedlami )

SELECT   automobile.model
FROM
color , automobile
WHERE
( color.color = 'black' ) and
( automobile.body_color_id = color.id ) and
( automobile.body_color_id = automobile.seat_color_id ) and
( automobile.doors = 4 )
GO

Výsledok dotazu však hovorí, že žiaden automobil nespĺňa podmienky dotazu. To však nie je pravda !!! ( automobil Cadillac DeVille Concours spĺňa všetky podmienky dotazu )

Result :
=============================================
model
--------------------------------

(0 row(s) affected)

Tento výsledok je samozrejme zlý, čo môže mať nedozerne následky. V našom prípade nepredáme zákazníkovi požadovaný automobil, aj keď sa na sklade nachádza. Poznamenajme, že táto zmena vo výsledku dotazu bola spôsobená vytvorením jednoduchého indexu na jeden zo stĺpcov tabuľky. Vytvorenie indexu by však v žiadnom prípade nemalo ovplyvniť množinu výsledkov SQL dotazu.

Diskuze (9) Další článek: Computer 7/99

Témata článku: Index, Tieto, Mercedes, Automobile, Mate, Nález, SQL, Vážná chyba, Cadillac, Doors, Cabriolet, Pre, Bmw, Karosérie, Go, Automobil, M/s, Chyba, Mercedes-Benz


Určitě si přečtěte

Pojďme programovat elektroniku: České chytré zásuvky Netio pro kutily i firmy

Pojďme programovat elektroniku: České chytré zásuvky Netio pro kutily i firmy

** Wi-Fi zásuvky nevyrábí pouze Čína ** Vyzkoušeli jsme českou Netio PowerCable ** Je přímo určená pro vývojáře, má totiž jednoduché JSON API

Jakub Čížek | 43

Hesla jsou zlo. Hackeři napáchali tolik škody právě proto, že vůbec existují

Hesla jsou zlo. Hackeři napáchali tolik škody právě proto, že vůbec existují

** Nikdo si je nepamatuje ** Žádné není zcela bezpečné ** Nejlepší by bylo je prostě zrušit

Jakub Čížek | 63

Nejlepší notebooky do 20 000 Kč. Tipy, co se dnes vyplatí koupit

Nejlepší notebooky do 20 000 Kč. Tipy, co se dnes vyplatí koupit

** S cenou do 20 tisíc lze vybrat solidní notebook na práci i hry ** Přenosné notebooky nabídnou i kovová těla a rychlý hardware ** Na hraní se hodí více peněz, ale na použitelný základ dvacet tisíc stačí

Tomáš Holčík, David Polesný | 45

Biblická potopa Česka: Jak bychom dopadli, kdyby nás zatopil oceán

Biblická potopa Česka: Jak bychom dopadli, kdyby nás zatopil oceán

** Představte si biblickou potopu ** Nejprve zaniknou Děčín a Břeclav, pak i Brno a Praha ** Hlavním městem se stane Jihlava a zbytky Čechů přežijí na Kvildě

Jakub Čížek | 93


Aktuální číslo časopisu Computer

Megatest: 20 powerbank s USB-C

Test: mobily do 3 500 Kč

Radíme s výběrem routeru

Tipy na nejlepší vánoční dárky