Požadavek sql-query
Účel a dopady
Spustí jeden nebo více SQL příkazů SELECT nad databází a vrátí jejich výsledky jako XML. Požadavek sám o sobě nic nemění v databázi (jde výhradně o SELECT), ale svým průběhem ovlivňuje interní statistiku doby trvání dotazů.
Dostupnost, kontext, oprávnění apod.
- Dostupné každému přihlášenému uživateli; jednotlivé
selectse spouští pod databázovým loginem přiřazeným efektivní roli volajícího (role, případně přepsané atributemopt-roles), ne pod obecným systémovým účtem. - Dotaz směrovaný do archivní databáze (
archive="true") smí spustit jen uživatel sr_admin– jinak je zamítnut jako bezpečnostní chyba. - Je-li na serveru zapnutý konfigurační filtr dotazů, je zamítnut i
select, jehož text obsahujemaster.,model.,tempdb.,msdb.,CONNECTIONPROPERTY(,SERVERPROPERTY(nebo@@. - Podléhá standardnímu transakčnímu zpracování obálky
<request>(transactional/přeskočení při odvolané transakci) – viz obálka požadavku.
XML požadavek (syntax + popis)
<request>
<sql-query
archive="{bool}"
opt-roles="{string}"
>
<select
type="{string}"
setting="{number}"
user="{number}"
opt-roles="{string}"
archive="{bool}"
avoid-xml="{bool}"
measure-time="{bool}"
>
{string}
</select> *
</sql-query>
</request>
Parametry a pravidla (atributy, potomci)
Uzel sql-query
archive- Archivní databáze - Výchozí hodnotaarchivepro všechny vnořenéselect, které ji sami nepřepíšou. (typ:bool; nepovinný; výchozí:false)opt-roles- Volitelná role - Výchozí volitelná role pro všechny vnořenéselect, které ji sami nepřepíšou. (typ:string; nepovinný)
Potomek: select (0 a vícekrát).
Uzel select
Obsahuje text SQL příkazu SELECT. Uzel nemá další potomky.
type- Typový název - Identifikace položky bez mezer a diakritiky (lze použít pomlčky a podtržítka); server ji beze změny přenáší do odpovídajícího uzluresult. (typ:string; nepovinný)setting- Setting id - Celočíselný identifikátor pro interní statistiku doby trvání dotazů; neplatná nebo chybějící hodnota se nahrazuje-1. (typ:number; nepovinný; výchozí:-1)user- Číslo uživatele - Stejný účel jakosetting, součást klíče interní statistiky; neplatná nebo chybějící hodnota se nahrazuje-1. (typ:number; nepovinný; výchozí:-1)opt-roles- Volitelná role - Přepíše pro tentoselectroli zděděnou zsql-query/přihlášení. (typ:string; nepovinný)archive- Archivní databáze - Přepíše pro tentoselecthodnotu zděděnou zsql-query. Vyžadujer_admin, jinak jeselectzamítnut. (typ:bool; nepovinný; výchozí: hodnotasql-query/@archive)avoid-xml- Bez automatického XML - Není-li"true", server ke skutečnému textu SELECTu automaticky připojí" FOR XML RAW". Text SELECTu proto sámFOR XML RAWobsahovat nemá – došlo by ke zdvojení a syntaktické chybě. (typ:bool; nepovinný; výchozí:false)measure-time- Měření doby trvání - Je-li"true", doplní se do odpovídajícího uzluresultatributyduration-queryaduration-fetch. Stejný efekt může vyvolat i globální konfigurační příznak serveru. (typ:bool; nepovinný; výchozí:false)
Závislosti
select/@archive(je-li uveden) přepisujesql-query/@archive; bez uvedení platí hodnota zděděná zsql-query.select/@opt-roles(je-li uveden) přepisujesql-query/@opt-roles; bez uvedení platí role přihlášeného uživatele nebo hodnota zděděná zsql-query.- Text SELECTu obsahující řetězec
-!-je serverem nahrazen číslem efektivní role volajícího – v archivním režimu (archive="true") je-!-nahrazen prázdným řetězcem místo čísla role. Typicky se používá pro dotazy nad view/objekty parametrizovanými rolí.
Vyhrazené kombinace type a textu SELECTu
Je-li type roven přesně "cycle-status", "xsystem____" nebo "getDate" a text SELECTu odpovídá jednomu z pěti pevně daných řetězců používaných pro synchronizaci času/cyklu, server dotaz vůbec nepředává databázi a vrací syntetickou odpověď. Mimo tuto přesnou shodu se select zpracuje běžným způsobem.
Příklady požadavku
(Zatím bez ověřeného příkladu; viz příklady dotazů a identifikace chyb.)
Zpracování a vedlejší účinky
- Ke skutečnému textu SELECTu se automaticky připojuje
" FOR XML RAW"(pokudavoid-xmlnení"true") – uzelrowv odpovědi je tedy přímým výstupem této klauzule MSSQL: co sloupec/alias v SELECTu, to atribut uzlurow. - Selhání jednoho
selectukončuje zpracování zbytku požadavku. Jakmile libovolnýselectv rámcisql-queryselže (bezpečnostní filtr, chyba databáze, neplatná role), server přestane provádět všechny dalšíselectv tomtéž požadavku – ty se vůbec nespustí a v odpovědi pro ně nevznikne aniresult, anierror. Klient nemá jak z odpovědi poznat, že pozdějšíselectbyl jen vynechán, a ne že vrátil prázdný výsledek. - Atributy
userasettingtvoří spolu stypeklíč interní agregované statistiky doby trvání dotazů (průměr a součet čtverců doby dotazu i fetch fáze). Agregace se zapisuje jen tehdy, je-li na serveru globálně zapnuté měření doby trvání; samotnémeasure-time="true"na jednotlivémselectdo agregátu nezapisuje, jen vrací naměřené hodnoty v odpovědi. - Prázdný text SELECTu (uzel
selectbez obsahu) je platný a vždy uspěje – vrátí<result type="…"/>bez volání databáze.
XML odpověď (syntax + popis)
<response>
<sql-query-result>
<result
type="{string}"
duration-query="{number}"
duration-fetch="{number}"
>
<row ... /> *
</result> *
<error ... /> *
</sql-query-result>
</response>
Příklady odpovědi
(Zatím bez ověřeného příkladu; viz příklady dotazů a identifikace chyb.)
Chyby a reakce
- Za každý úspěšně provedený
selectvzniká právě jeden uzelresultse stejnýmtype, jaký měl vstupníselect(prázdný, pokudtypenebyl uveden). Atributyduration-query/duration-fetchse doplní jen přimeasure-time="true"nebo zapnutém globálním měření doby trvání. - Za neúspěšný
select(bezpečnostní filtr nebo chyba databáze) nevzniká žádnýresult; místo něj se do odpovědi vloží jeden nebo více uzlůerror(obecný tvar viz sdílený typ error) – databázová vrstva může k jedné chybě zalogovat víc diagnostických záznamů, takžeerrorse může vyskytnout i vícekrát za jediný neúspěšnýselect. - Jak je popsáno výše v sekci Zpracování, první neúspěch v dávce znamená, že se všechny následující
selectv tomtéž požadavku přeskočí beze stopy (bezresulti bezerror). - Výraz pro identifikaci chyb v odpovědi serveru:
sql-query-result[error].
Související požadavky
- get-settings, save-settings – další způsob práce s XML/SQL daty ve stejné skupině požadavků.