Internet Windows Android
Kengaytirish

Kursorlar. DECLARE CURSOR buyrug'i umumiy qoidalar Transact sql cursors

T-SQL kodimda men har doim to'plamga asoslangan operatsiyalardan foydalanaman. Menga aytilishicha, bu turdagi operatsiyalar SQL Server qayta ishlash uchun mo'ljallangan va u ketma-ket ishlov berishdan tezroq bo'lishi kerak. Men kursorlar mavjudligini bilaman, lekin ulardan qanday foydalanishni bilmayman. Kursor misollarini keltira olasizmi? Kursorlarni qachon ishlatish haqida ko'rsatma bera olasizmi? O'ylaymanki, Microsoft ularni SQL Serverga biron bir sababga ko'ra qo'shgan, shuning uchun ular samarali tarzda ishlatilishi mumkin bo'lgan joyga ega bo'lishi kerak.

yechim

Ba'zi doiralarda "s kursorlar hech qachon ishlatilmaydi, boshqalarida ular oxirgi chora hisoblanadi va boshqa guruhlarda ular muntazam ravishda qo'llaniladi. Bu lagerlarning har birida kursordan foydalanish bo'yicha o'z pozitsiyalari uchun turli sabablar bor. Kursorlar ustidagi stendingizdan qat'i nazar, ular ehtimol boshqalarda emas, balki muayyan vaziyatlarda o‘z o‘rniga ega bo‘ling.Demak, bu kodlash texnikasini tushunishingizga, so‘ngra kursorga asoslangan ishlov berish to‘g‘ri yoki yo‘qligi to‘g‘risida qaror qabul qilish uchun muammoni tushunishingizga bog‘liq. Keling, boshlaymiz. quyidagilarni bajaring:

  • Kursor misoliga qarang
  • Kursorning tarkibiy qismlarini ajrating
  • Qo'shimcha kursor misollarini keltiring
  • Kursordan foydalanishning ijobiy va salbiy tomonlarini tahlil qiling

SQL Server kursorini qanday yaratish mumkin

SQL Server kursorini yaratish izchil jarayondir, shuning uchun qadamlarni o'rganganingizdan so'ng, ma'lumotlar orqali aylanish uchun ularni turli xil mantiq to'plamlari bilan osongina takrorlashingiz mumkin. Keling, qadamlarni ko'rib chiqaylik:

  1. Birinchidan, siz mantiqda kerak bo'lgan o'zgaruvchilaringizni e'lon qilasiz.
  2. Ikkinchidan, siz kursorni mantiq davomida ishlatadigan ma'lum bir nom bilan e'lon qilasiz. Bu kursorni ochish bilan darhol amalga oshiriladi.
  3. Uchinchidan, ma'lumotlarni qayta ishlashni boshlash uchun kursordan yozuvni olasiz.
  4. To'rtinchidan, har bir mantiq to'plamiga xos bo'lgan ma'lumotlar jarayoni. Bu qo'shish, yangilash, o'chirish va hokazo bo'lishi mumkin. olingan ma'lumotlarning har bir qatori uchun. Bu har bir satrda bajariladigan ushbu jarayon davomida mantiqning eng muhim to'plamidir.
  5. Beshinchidan, kursordan keyingi yozuvni 3-bosqichda bo'lgani kabi olasiz va keyin tanlangan ma'lumotlarni qayta ishlash orqali 4-bosqich yana takrorlanadi.
  6. Oltinchidan, barcha ma'lumotlar qayta ishlangach, kursorni yopasiz.
  7. Yakuniy va muhim qadam sifatida, SQL Server ega bo'lgan barcha ichki resurslarni chiqarish uchun kursorni bo'shatish kerak.

Bu yerdan, SQL Server kursorlaridan qachon foydalanish va buni qanday qilishni bilishni boshlash uchun quyidagi misollarni ko'rib chiqing.

SQL Server kursoriga misol

Mana, barcha SQL Server ma'lumotlar bazalarining zaxira nusxasini yaratish uchun oddiy skript maslahatidan misol kursori, bu erda zaxira nusxalari ketma-ket ravishda chiqariladi:

DECLARE @name VARCHAR(50) -- ma'lumotlar bazasi nomi DECLARE @path VARCHAR(256) -- zahiraviy fayllar uchun yo'l DECLARE @fileName VARCHAR(256) -- zaxira uchun fayl nomi DECLARE @fileDate VARCHAR(20) -- fayl nomi SET uchun ishlatiladi @path = "C:\Backup\" SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) MASTER.dbo.sysdatabases dan nom tanlash uchun db_cursor KURSORNI E'LON QILING ("master","model ","msdb","tempdb") db_cursorni OCHISH @@FETCH_STATUS HAQIDA @namega db_cursor KEYINGI OLISH @fileName = @path + @name + "_" + @fileDate + ".BAK" MA'LUMOT BAZASI ZAXIRA @ name TO DISK = @fileName DB_kursordan KEYINGI OLISH @name END INTO END YOPISH db_cursor db_kursorni BOSHLASH

SQL Server kursor komponentlari

Yuqoridagi misolga asoslanib, kursorlar quyidagi komponentlarni o'z ichiga oladi:

  • DECLARE operatorlari - kod blokida ishlatiladigan o'zgaruvchilarni e'lon qilish
  • SET\SELECT iboralari - o'zgaruvchilarni ma'lum bir qiymatga ishga tushirish
  • DECLARE CURSOR operatori - kursorni baholanadigan qiymatlar bilan to'ldiring
    • DIQQAT - DECLARE CURSOR FOR operatorida SELECT operatoridagi kabi o'zgaruvchilar soni teng. Bu 1 yoki bir nechta o'zgaruvchilar va bog'langan ustunlar bo'lishi mumkin.
  • OPEN bayonoti - ma'lumotlarni qayta ishlashni boshlash uchun kursorni oching
  • FETCH NEXT bayonotlari - Kursordan o'zgaruvchilarga ma'lum qiymatlarni tayinlang
    • QAYD - Ushbu mantiq WHILE iborasining bir qismi sifatida WHILE iborasidan oldingi boshlang'ich to'plam uchun, so'ngra jarayondagi har bir tsikl davomida yana ishlatiladi.
  • WHILE bayonoti - Ma'lumotlarni qayta ishlashni boshlash va davom ettirish sharti
  • BEGIN...END bayonoti - kod blokining boshlanishi va oxiri
    • QAYD - Ma'lumotlarni qayta ishlash asosida bir nechta BEGIN...END iboralaridan foydalanish mumkin
  • Ma'lumotlarni qayta ishlash - Bu misolda bu mantiq ma'lumotlar bazasini ma'lum bir yo'l va fayl nomiga zaxiralashdir, lekin bu har qanday DML yoki ma'muriy mantiq bo'lishi mumkin
  • CLOSE bayonoti - joriy ma'lumotlarni va tegishli qulflarni chiqaradi, lekin kursorni qayta ochishga ruxsat beradi.
  • DEALLOCATE bayonoti - kursorni yo'q qiladi

Tavsiya etilgan o'qish

SQL Server kursorlari va muqobillari haqida ko'proq bilib oling:

Qo'shimcha SQL Server kursoriga misollar

Yuqoridagi misolda zaxira nusxalari kursor orqali chiqariladi, kursorga asoslangan mantiqdan foydalanadigan boshqa maslahatlarga qarang:

  • SQL Serverda tashqi kalit cheklovlarini o'chirish, yoqish, tushirish va qayta yaratish buyruqlarini yaratish uchun skript

SQL Server kursor tahlili

Quyidagi tahlil kursorga asoslangan mantiq foydali yoki bo'lmasligi mumkin bo'lgan turli stsenariylarni tushunish uchun mo'ljallangan:

  • Onlayn tranzaktsiyalarni qayta ishlash (OLTP) - Ko'pgina OLTP muhitlarida SET-ga asoslangan mantiq qisqa tranzaktsiyalar uchun eng mantiqiydir. Bizning jamoamiz barcha ishlov berish uchun kursorlardan foydalanadigan uchinchi tomon ilovasiga duch keldi, bu esa muammolarni keltirib chiqardi, ammo bu kamdan-kam uchraydigan hodisa. Odatda, SET-ga asoslangan mantiq mumkin emas va kursorlar kamdan-kam hollarda kerak bo'ladi.
  • Hisobot - Hisobotlar dizayni va asosiy dizaynga asoslanib, kursorlar odatda kerak emas. Biroq, bizning jamoamiz asosiy ma'lumotlar bazasida ma'lumotlarning yaxlitligi mavjud bo'lmagan va hisobot qiymatlarini to'g'ri hisoblash uchun kursordan foydalanish zarur bo'lgan hisobot talablariga duch keldi. Biz quyi oqim jarayonlari uchun ma'lumotlarni jamlash zarurati tug'ilganda ham xuddi shunday tajribaga ega bo'ldik, kursorga asoslangan yondashuv tezda ishlab chiqildi va ehtiyojni qondirish uchun maqbul tarzda amalga oshirildi.
  • Seriyalashtirilgan ishlov berish - Agar jarayonni ketma-ket ravishda yakunlash kerak bo'lsa, kursorlar maqbul variantdir.
  • Ma'muriy vazifalar - Ko'pgina ma'muriy vazifalar ketma-ket bajarilishi kerak, bu kursorga asoslangan mantiqqa juda mos keladi, ammo ehtiyojni qondirish uchun boshqa tizimga asoslangan ob'ektlar mavjud. Bunday vaziyatlarning ba'zilarida jarayonni yakunlash uchun kursorlar ishlatiladi.
  • Katta ma'lumotlar to'plamlari - Katta ma'lumotlar to'plamlari bilan siz quyidagilardan biriga yoki bir nechtasiga duch kelishingiz mumkin:
    • Kursorga asoslangan mantiq qayta ishlash ehtiyojlarini qondira olmaydi.
    • Minimal xotira miqdori bo'lgan serverlarda katta to'plamga asoslangan operatsiyalar bilan ma'lumotlar sahifalangan bo'lishi yoki SQL Serverni monopollashtirishi mumkin, bu vaqt talab qiladigan nizo va xotira muammolariga olib kelishi mumkin. Shunday qilib, kursorga asoslangan yondashuv ehtiyojni qondirishi mumkin.
    • Ba'zi vositalar tabiiy ravishda ma'lumotni qopqoq ostidagi faylga keshlaydi, shuning uchun xotirada ma'lumotlarni qayta ishlash aslida shunday bo'lishi mumkin yoki bo'lmasligi mumkin.
    • Agar ma'lumotlar bosqichma-bosqich SQL Server ma'lumotlar bazasida qayta ishlanishi mumkin bo'lsa, ishlab chiqarish muhitiga ta'sir faqat yakuniy ma'lumotlarga ishlov berilganda bo'ladi. Sting serveridagi barcha resurslar ETL jarayonlari uchun ishlatilishi mumkin, so'ngra yakuniy ma'lumotlarni import qilish mumkin.
    • SSIS katta ma'lumotlar to'plamini boshqariladigan o'lchamlarga bo'lish va kursor bilan ketma-ket yondashuvdan ko'ra yaxshiroq ishlashga bo'lgan umumiy ehtiyojni hal qilishi mumkin bo'lgan ma'lumotlar to'plamini qo'llab-quvvatlaydi.
    • Kursor yoki SSIS mantig'i qanday kodlanganiga qarab, xatolik nuqtasida qayta ishga tushirish mumkin bo'lishi mumkin.
    • GO buyrug'i bilan to'plamni takrorlang
    Keyingi qadamlar
    • Ma'lumotlarni qayta ishlash qaroriga duch kelganingizda, SQL Server kursoridan foydalanish bilan qayerda turishingizni aniqlang. Ular sizning arizangiz yoki operatsion jarayonlaringizda o'z o'rniga ega bo'lishi mumkin yoki bo'lmasligi mumkin. Vazifani bajarishning ko'plab usullari mavjud, shuning uchun kursordan foydalanish oqilona muqobil bo'lishi mumkin yoki yo'q. Siz hakam bo'ling.
    • Agar siz boshqa kodlash texnikasi bilan bog'liq muammolarga duch kelsangiz va biror narsani tezda bajarishingiz kerak bo'lsa, kursordan foydalanish muqobil variant bo'lishi mumkin. Ma'lumotlarni qayta ishlash ko'proq vaqt talab qilishi mumkin, ammo kodlash vaqti ancha kam bo'lishi mumkin. Agar sizda bir martalik jarayon yoki tungi ishlov berishingiz bo'lsa, bu hiyla-nayrang qilishi mumkin.
    • Agar sizning muhitingizda kursorlar o'chirilgan bo'lsa, boshqa munosib alternativani tanlaganingizga ishonch hosil qiling. Jarayon boshqa muammolarni keltirib chiqarmasligiga ishonch hosil qiling. Misol tariqasida, agar kursor ishlatilsa va millionlab satrlar qayta ishlansa, bu barcha ma'lumotlarni keshdan o'chirib tashlashi va keyingi tortishuvlarga olib kelishi mumkinmi? Yoki katta ma'lumotlar to'plami bilan ma'lumotlar diskda sahifalanadi yoki vaqtinchalik katalogga yoziladimi?
    • Kursorga asoslangan yondashuvni boshqa muqobillarga nisbatan baholar ekansiz, vaqt, tortishuv va zarur resurslar nuqtai nazaridan usullarni adolatli taqqoslang. Umid qilamanki, bu omillar sizni to'g'ri texnikaga olib boradi.

Ehtimol, mijozning oddiy so'roviga javob ko'pchilik mijozlar uchun hazm bo'lmaydigan yuz minglab qatorlar tanlovi bo'lishi mumkin. Bunday holda, mijozlar bilan o'zaro munosabatlar muammosini hal qilish server va mijoz o'rtasida ma'lumot almashishning universal mexanizmi sifatida kursorlardan foydalanish hisoblanadi. Kursorlar olingan ma'lumotlar to'plami (so'rov natijasi) bilan ishlaydi va foydalanuvchilarga ma'lumotlarni qayta ishlash uchun qo'shimcha imkoniyatlar beradi:

Kursorlar ma'lumotlar to'plamida ularning seriya raqamini ko'rsatish orqali jadval qatorlari bilan ishlash imkonini beradi;

Kursorlar sizga murakkab ma'lumotlarni o'zgartirish operatsiyalarini amalga oshirishga imkon beradi, masalan, ustun qiymatini o'zgartirish boshqa ustunlar qiymatlariga qayta-qayta kirishni talab qilganda.

Kursorning hayot aylanishi:

Kursor yaratish: E'lon qiling<имя курсора>[SEZOR] [AYLANGAN] KURSOR UCHUN< SELECT -оператор>UCHUN (FAQAT OʻQISH | YANGILANISH)

Bu yerda INSENSITIVE kalit so'zi kursorning statik bo'lishini (ma'lumotlarning oniy tasviri) bildiradi, sukut bo'yicha kursor dinamik tarzda yaratilgan (tanlov har safar qatorga kirishda amalga oshiriladi). SCROLL kalit so'zi kursorni istalgan yo'nalishda aylantirish mumkinligini bildiradi, aks holda kursor "ketma-ket" yaratiladi.

Kursor ochilishi: OCHIQ[GLOBAL]<имя курсора>. GLOBAL deb belgilangan kursor, u chaqirilgan protsedura yoki paket tugashi bilan avtomatik ravishda o'chirilmaydi.

O'qishma'lumotlar : OLISH [[ KEYINGI | OLDINDAN | BIRINCHI | oxirgi | ABSOLUTE n | RELATIVE n ] FROM ] [ GLOBAL ]<имя курсора>[ INTO @ o'zgaruvchi _ nomi , …]. SQL Server 2000 kursordan faqat bitta qatorni o'qish imkonini beradi. FIRST kalit so'zi kursorning birinchi qatorini qaytarishdir; LAST - kursorning oxirgi qatori; NEXT - joriy satrdan keyingi keyingi satr, qaytarilgan qator joriy bo'ladi; PRIOR - hozirgisidan oldingi oldingi; ABSOLUTE n - satrni kursordagi mutlaq seriya raqami bilan qaytaradi; RELATIVE - joriy satrdan keyin n qator. Ustun ma'lumotlari belgilangan o'zgaruvchilarning har birida ular ro'yxatga olingan tartibda saqlanadi.

Ma'lumotlar o'zgarishi: kursorlar bilan ishlash uchun mo'ljallangan sintaksisi bilan UPDATE buyrug'ini bajaradi.

Ma'lumotlarni o'chirish: kursorlar bilan ishlash uchun mo'ljallangan sintaksisi bilan DELETE buyrug'ini bajaradi.

Kursor yopish: YAPISH[GLOBAL]<имя курсора>

Kursorni bo'shatish: BERISH [GLOBAL]<имя курсора>

Kursor misoli:

fo_curs KURSOR STATIC FOR

ORDER BY name_eng dan name_eng ni tanlang

DECLARE @name varchar(50)

FETCH FROM FROM FIRST FROM INTO INTO @name

WHILE @@FETCH_STATUS=0

FETCH FROM NEXT FROM fo_curs INTO @name

DEALLOCATE fo_curs

2.7. Microsoft SQL Serverda ma'lumotlar xavfsizligi va yaxlitligini ta'minlash. Ma'lumotlar bazasini boshqarish. Rollar. Foydalanuvchilarga huquqlarni berish (TRANSFOR, RAD ET, REVOKE). SQL Serverda ma'lumotlarni himoya qilish usullari va texnologiyalari.

SQL Server xavfsizligi va boshqaruvi. .

Ma'lumotlar bazasining asosiy vazifasi tanlangan mavzu doirasidagi ma'lumotlarning yaxlitligi va izchilligini ta'minlashdan iborat. Tizimning ushbu muammoni hal qilishiga to'sqinlik qiluvchi omillardan biri tasodifiy yoki ataylab ma'lumotlar strukturasini yo'q qilishga yoki ma'lumotlarning o'zini o'zgartirishga urinayotgan foydalanuvchilarning harakatlaridir. Shuning uchun ma'lumotlar bazasini nafaqat jismoniy nosozliklardan, balki amalga oshirilayotgan vazifalarni bajarish uchun etarli bo'lmagan foydalanuvchilardan ham himoya qilish kerak. Buning uchun foydalanuvchilarning o'z vakolatlari doirasidan tashqariga chiqadigan harakatlarni amalga oshirishiga to'sqinlik qiladigan xavfsizlik tizimini loyihalash va ma'lumotlar bazasiga ulash zarur.

Ma'lumotlar bazasini boshqarish

TSQL yordamida ma'lumotlar bazasini yaratish uchun CREATE DATABASE buyrug'i ishlatiladi, lekin odatda bu maqsadda SQL Server Management Studio dasturidan foydalaniladi. SQL Serverda ma'lumotlar bazasining bir nechta operatsiyalari aniqlangan: fayl hajmini oshirish (kamaytirish), konfiguratsiyani o'zgartirish (ALTER buyrug'i), biriktirish va ajratish, egalik huquqini o'tkazish, nomni o'zgartirish, xususiyatlarni ko'rish va nihoyat o'chirish (DROP DATABASE).

Ko'pgina ma'lumotlar bazasi serverlarida bo'lgani kabi, SQL Serverda ham to'liq ma'muriy imtiyozlarga ega foydalanuvchi mavjud - bu Tizim ma'muri yoki "sa". Dastlabki server o'rnatilgandan so'ng, sa paroli bo'sh. Yangi ma'lumotlar bazasini yaratgan foydalanuvchi avtomatik ravishda uning egasiga aylanadi ('dbo" - Ma'lumotlar bazasi egasi).Ma'lumotlar bazasini yaratish vaqtida "mehmon" foydalanuvchi ham aniqlanadi.Agar foydalanuvchi hisobi ma'lum bir ma'lumotlar bazasi foydalanuvchisi bilan aniq ko'rsatilmagan bo'lsa. , foydalanuvchi mehmon nomidan foydalangan holda yashirin kirish huquqiga ega. Mehmon odatda taqiqlanadi.

Ma'lumotlar bazasida ob'ektni yaratgan foydalanuvchi avtomatik ravishda ob'ekt egasiga aylanadi va hech kim, shu jumladan dbo va sa ob'ekt egasi unga huquq bermaguncha ob'ektdan foydalana olmaydi. Lekin foydalanuvchi ob'ektni yaratishi uchun ma'lumotlar bazasi egasi birinchi navbatda unga tegishli huquqlarni berishi kerak.

Rol boshqaruvni soddalashtirish uchun bir xil funktsiyalarni bajaradigan foydalanuvchilarni birlashtirishga imkon beradi. Rollar o'rnatilgan va moslashtirilgan. O'rnatilgan rollar server darajasida va ma'lumotlar bazasi darajasida amalga oshiriladi. Quyida ma'lumotlar bazasi uchun o'rnatilgan rollar jadvali keltirilgan:

db_owner. Ma'lumotlar bazasida barcha huquqlarga ega

db_accessadmin. Foydalanuvchilarni qo'shish yoki o'chirish mumkin

db_securityadmin. Barcha ruxsatlar, ob'ektlar, rollar va foydalanuvchilarni boshqaradi

db_ddladmin. GRANT, DENY, REVOKE dan tashqari barcha DDL buyruqlarini bajarishi mumkin

db_backupoperator. Arxivlash buyruqlarini bajara oladi. ma'lumotlar

db_datareader. Ko'rish mumkin. har qanday jadvaldagi har qanday ma'lumotlar

db_datawriter. Ehtimol, modifikatsiya. har qanday jadvaldagi har qanday ma'lumotlar

db_denydatareader. Taqiqlangan ko'rinish sevgi har qanday ma'lumotlar jadvallar

db_denydatawriter. Har qanday jadvaldagi ma'lumotlarni o'zgartirishni taqiqlang

Foydalanuvchilarga huquqlarni tayinlash. SQL Server xavfsizligining asosi (1) hisoblar; (2) foydalanuvchilar (foydalanuvchilar); (3) rollar; (4) guruhlar.

Foydalanuvchi SQL Serverga ulanganda, ular bajarishi mumkin bo'lgan harakatlar ularga foydalanuvchi va rol a'zosi sifatida berilgan huquqlar bilan belgilanadi. Huquqlar ma'lumotlar bazasi ma'muri, ma'lumotlar bazasi egasi yoki ma'lum bir ma'lumotlar bazasi ob'ektining egasi tomonidan beriladi. Ma'lumotlar bazasi huquqlarini uchta toifaga bo'lish mumkin: (1) ma'lumotlar bazasi ob'ektlariga kirish huquqi; (2) TSQL buyruqlarini bajarish huquqlari; (3) yashirin huquqlar. Server sizga egalik huquqini bir foydalanuvchidan boshqasiga o'tkazish imkonini beradi.

Ma'lumotlar bazasi ob'ektlariga kirish uchun foydalanuvchi ruxsatlarini boshqarish uchun quyidagi buyruqlar qo'llaniladi:

Grant( HAMMA |< вид действия >,…}

( ON (<имя таблицы или представления>} [(<имя столбца>,…)]

| ON (< имя хранимой процедуры >}

| ON (< имя пользовательской функции >}

TO ( Ommaviy |<имя объекта системы безопасности>,…}

[ AS<имя группы> | <имя роли>]

foydalanuvchilarga huquqlarni tayinlash, qayerda

ALL - foydalanuvchiga barcha mumkin bo'lgan ruxsatlar beriladi, aks holda belgilang

<вид действия>- foydalanuvchi uchun mavjud bo'lgan harakatlarga bo'lgan huquqlar, xususan:

SELECT - ko'rish uchun, jadval ustuni va jadval uchun (ko'rish)

INSERT - qo'shish uchun, butun jadval (ko'rinish) uchun

UPDATE - o'zgartirish uchun, jadval ustuni va jadval uchun (ko'rish)

DELETE - o'chirish uchun, butun jadval (ko'rish) uchun

EXECUTE - saqlangan protseduralarni bajarish uchun

MA'LUMOTLAR - ko'rsatilgan ob'ektga murojaat qilish qobiliyati (xorijiy kalitga kiritilishi kerak).

<имя объекта системы безопасности>– SQL Server hisoblari, Windows domen foydalanuvchilari; PUBLIC - barcha foydalanuvchilar uchun.

GRANT OPSIONASI BILAN - Hozirda berilgan foydalanuvchiga boshqa foydalanuvchilarga ob'ektga kirish huquqini belgilash imkonini beradi.

AS<имя группы> | <имя роли>- foydalanuvchining boshqa foydalanuvchilarga huquqlar berish imkoniyati berilgan rolda ishtirok etishi.

Mualliflarni Ommaga TANLASH

Meri, Jon va Tomga mualliflarni qo'shish, yangilash, o'chirish

Buxgalteriya hisobiga Plan_Ma'lumotlarini GRANT VARIANTI BILAN TANLASH

Jek AS Buxgalteriya hisobiga Plan_Data TANLOVCHI BERING

Jek Buxgalteriya rolida emas, lekin bu roldagi kimdir huquqni berishi mumkin

INDOR QILING( HAMMA |< вид действия >,…}

( ON (<имя таблицы или представления>} [(<имя столбца>,…)]

| ON (<имя хранимой процедуры>}

| ON (<имя пользовательской функции>}

TO ( Ommaviy |<имя объекта системы безопасности>,…}

Ruxsat yo'q foydalanuvchilarni ma'lumotlar bazasi ob'ektlariga. CASCADE nafaqat ushbu foydalanuvchining, balki u huquqlar bergan har bir kishining huquqlarini bekor qiladi.

Misol (yoqilgan buyruq bajarilishini o'chirib qo'yish TSQL):

Jek CASCADE UCHUN JADVAL YARATISHNI INDOR QILING

Buyruq BEKOR QILISh ma'lumotlar bazasi ob'ektlariga kirishni bilvosita rad etish uchun ishlatiladi. Sintaksis DENY buyrug'i bilan bir xil. Yashirin rad etish kirishni rad etishga o'xshaydi, farqi shundaki, u faqat belgilangan darajada kuchga kiradi. Misol: GoodUsers rolining a'zosi bo'lgan Jek foydalanuvchisiga XFiles jadvaliga kirish huquqi berilgan. Agar GoodUsers roli REVOKE bilan ushbu jadvalga kirishni rad etsa, foydalanuvchi Jek ushbu jadvalga kirishi mumkin, chunki uning huquqlari aniq belgilangan. Agar siz unga shaxsan REVOKE ni murojaat qilsangiz, u XFiles-ga kirish huquqini yo'qotadi.

Rollarga berilgan ruxsatlar ularning a'zolari tomonidan meros qilib olinadi. Agar foydalanuvchiga bir rolga a'zo bo'lish orqali ob'ektga kirish huquqi berilsa, lekin boshqa rolda rad etilsa, kirish nizosi har doim rad etish foydasiga hal qilinadi.

MS SQL Serverda ma'lumotlarni himoya qilish texnologiyalari

1. Mexanizm nazorat punktlari- yangilangan sahifalarni diskka yozish uchun ~60 soniyadan keyin yaratiladigan nazorat nuqtalari (nazorat punkti CHECKPOINT buyrug'i bilan majburiy bo'lishi mumkin).

2. Ma'lumotlar bazasining yaxlitligini tekshirish uchun o'rnatilgan va tashqi mexanizmlar (avtomatik ravishda ishga tushiriladi yoki DBCC yordam dasturi kabi - Ma'lumotlar bazasi izchilligini tekshirish - qo'lda).

3. Operatsion tizim (shu jumladan, aks ettirilgan qattiq disklar mexanizmi) yordamida ma'lumotlar bazasi fayllarini jismoniy takrorlash (ruxsat etilgan bo'lsa).

4. Ma'lumotlar bazalari va tranzaksiya jurnallarining zaxira nusxasini yaratish - zaxira qurilmasiga (magnit lenta yoki qattiq disk) ma'lumotlar bazasi dumpini yozish orqali.

5. Replikatsiya - axborotni bir SQL serverdan ikkinchisiga davriy (ayrim hollarda - sinxron) o'tkazish orqali takrorlash imkoniyati.

6. Mijoz va server o'rtasidagi trafikni shifrlash, shuningdek, ma'lumotlar bazasi ob'ektlari (saqlanuvchi protseduralar, triggerlar va boshqalar) bilan ishlash uchun ishlatiladigan kodlarni shifrlash.

Kursor aniqlangan. Uning turlari va xatti-harakatlarining tavsifi berilgan: statik, dinamik, ketma-ket va kalit kursorlar. Kursorni boshqarish tamoyillari tavsiflanadi: kursorni yaratish va ochish, ma'lumotlarni o'qish, kursorni yopish. Kursorni dasturlash misollari keltirilgan.

Kursor tushunchasi

Relyatsion ma'lumotlar bazasi so'rovi odatda ma'lumotlarning bir nechta qatorlarini (yozuvlarini) qaytaradi, lekin dastur bir vaqtning o'zida faqat bitta yozuvni qayta ishlaydi. Agar u bir vaqtning o'zida bir nechta satrlar bilan shug'ullansa ham (masalan, elektron jadvallar ko'rinishidagi ma'lumotlarni chiqarish), ularning soni hali ham cheklangan. Bundan tashqari, ma'lumotlarni o'zgartirish, o'chirish yoki qo'shishda ish birligi qator hisoblanadi. Bunday vaziyatda kursor tushunchasi birinchi o'ringa chiqadi va bu kontekstda kursor qatorga ko'rsatgich hisoblanadi.

SQL-dagi kursor - bu oxirgi SQL bayonotini saqlashga mo'ljallangan ma'lumotlar bazasi xotirasidagi hudud. Agar joriy bayonot ma'lumotlar bazasi so'rovi bo'lsa, joriy qiymat yoki joriy kursor chizig'i deb ataladigan so'rov ma'lumotlari qatori ham xotirada saqlanadi. Xotiradagi belgilangan maydon nomlanadi va amaliy dasturlar uchun mavjud.

Odatda, kursorlar ma'lumotlar bazasida saqlanadigan ma'lumotlarning bir qismini tanlash uchun ishlatiladi. Bir vaqtning o'zida bir kursor qatori ilova tomonidan tekshirilishi mumkin. Kursorlar ko'pincha protsessual tillarda yozilgan amaliy dasturlarga kiritilgan SQL operatorlarida qo'llaniladi. Ulardan ba'zilari ma'lumotlar bazasi serveri tomonidan bilvosita yaratilgan, boshqalari esa dasturchilar tomonidan belgilanadi.

SQL standartiga muvofiq, kursorlar bilan ishlashda quyidagi asosiy amallarni ajratib ko'rsatish mumkin:

  • yaratish yoki kursor deklaratsiyasi;
  • kursor ochilishi, ya'ni. uni ko'p darajali xotirada saqlanadigan ma'lumotlar bilan to'ldirish;
  • kursordan oling va u bilan ma'lumotlar qatorlarini o'zgartirish;
  • kursorni yopish, shundan so'ng u foydalanuvchi dasturlari uchun mavjud bo'lmaydi;
  • kursorni bo'shatish, ya'ni. kursorni ob'ekt sifatida o'chirish, chunki uni yopish u bilan bog'liq xotirani bo'shatish shart emas.

Turli xil ilovalarda kursorning ta'rifi ba'zi farqlarga ega bo'lishi mumkin. Shunday qilib, masalan, ba'zida ishlab chiquvchi kursor uchun ajratilgan xotirani aniq bo'shatishi kerak. Keyin kursorni bo'shatish u bilan bog'liq xotira ham bo'shatiladi. Bu uning ismini qayta ishlatish imkonini beradi. Boshqa ilovalarda, kursorni yopish xotira bilvosita ajratiladi. Qayta tiklashdan so'ng darhol boshqa operatsiyalar uchun foydalanish mumkin bo'ladi: boshqa kursorni ochish va hokazo.

Ba'zi hollarda kursordan foydalanishdan qochib bo'lmaydi. Biroq, iloji bo'lsa, bundan qochish kerak va standart ma'lumotlarni qayta ishlash buyruqlari bilan ishlash kerak: SELECT , UPDATE , INSERT , DELETE . Kursorlar ma'lumotlarning butun hajmida o'zgartirish operatsiyalarini bajarishga imkon bermasligiga qo'shimcha ravishda, kursor yordamida ma'lumotlarni qayta ishlash operatsiyalarini bajarish tezligi standart SQL vositalariga qaraganda sezilarli darajada past.

MS SQL Server muhitida kursorlarni amalga oshirish

SQL Server uch turdagi kursorlarni qo'llab-quvvatlaydi:

  • SQL kursorlari asosan triggerlar, saqlangan protseduralar va skriptlar ichida ishlatiladi;
  • server kursorlari serverda ishlaydi va ODBC, OLE DB, DB_Library uchun amaliy dasturlash interfeysini amalga oshiradi;
  • mijoz kursorlari mijozning o'zida amalga oshiriladi. Ular serverdan barcha natijalar to'plamini oladi va uni mahalliy sifatida saqlaydi, bu esa tarmoq operatsiyalarining isrofgarligini kamaytirish orqali ma'lumotlarni qayta ishlash operatsiyalarini tezlashtiradi.

Ko'p foydalanuvchi ilovalarining har xil turlari har xil turdagi parallel ma'lumotlarga kirishni talab qiladi. Ba'zi ilovalar ma'lumotlar bazasidagi o'zgarishlar haqidagi ma'lumotlarga darhol kirishni talab qiladi. Bu chiptalarni bron qilish tizimlari uchun odatiy holdir. Boshqa hollarda, masalan, statistik hisobot tizimlarida ma'lumotlarning barqarorligi muhim ahamiyatga ega, chunki ular doimiy ravishda o'zgartirilsa, dasturlar axborotni samarali namoyish eta olmaydi. Turli xil ilovalar kursorlarning turli xil ilovalarini talab qiladi.

SQL Server muhitida kursorlarning turlari ular taqdim etayotgan imkoniyatlarga ko‘ra farqlanadi. Kursor turi uni yaratish bosqichida aniqlanadi va uni o'zgartirib bo'lmaydi. Ba'zi kursor turlari natijalar to'plamiga kiritilgan qatorlarga boshqa foydalanuvchilar tomonidan kiritilgan o'zgarishlarni aniqlay oladi. Biroq, SQL Server bunday satrlardagi o'zgarishlarni faqat satrga kirish bosqichida kuzatib boradi va satr allaqachon o'qilganidan keyin o'zgarishlarni o'zgartirishga ruxsat bermaydi.

Kursorlar ikki toifaga bo'linadi: ketma-ket va aylantirilishi mumkin. Ketma-ket faqat bitta yo'nalishda - boshidan oxirigacha ma'lumotlarni tanlash imkonini beradi. Qaytib olinadigan kursorlar ko'proq harakat erkinligini ta'minlash - siz ikkala yo'nalishda harakat qilishingiz va kursorning natijalar to'plamining ixtiyoriy qatoriga o'tishingiz mumkin.Agar dastur kursor ko'rsatgan ma'lumotlarni o'zgartirishga qodir bo'lsa, u aylantiriladigan va o'zgartiriladigan deb ataladi. Kursorlar haqida gapirganda, tranzaktsiyalarni izolyatsiya qilish haqida unutmaslik kerak. Bir foydalanuvchi yozuvni o'zgartirganda, boshqasi uni o'z kursori bilan o'qiydi va bundan tashqari, u bir xil yozuvni o'zgartirishi mumkin, bu esa ma'lumotlar yaxlitligini saqlashni talab qiladi.

SQL Server statik, dinamik, ketma-ket va kalitlar to'plami tomonidan boshqariladi.

Bilan sxemada statik kursor ma'lumotlar ma'lumotlar bazasidan bir marta o'qiladi va oniy tasvir sifatida saqlanadi (vaqtning ma'lum bir nuqtasida), shuning uchun boshqa foydalanuvchi tomonidan ma'lumotlar bazasiga kiritilgan o'zgarishlar ko'rinmaydi. Qisqa muddatga kursor ochilishi server o'zining to'liq natijalar to'plamiga kiritilgan barcha satrlarda qulfni oladi. Statik kursor yaratilgandan keyin o'zgarmaydi va har doim ochilish vaqtida mavjud bo'lgan ma'lumotlar to'plamini ko'rsatadi.

Agar boshqa foydalanuvchilar manba jadvalidagi kursorga kiritilgan ma'lumotlarni o'zgartirsa, bu ta'sir qilmaydi statik kursor.

IN statik kursor Siz o'zgartirish kirita olmaysiz, shuning uchun u har doim faqat o'qish rejimida ochiladi.

Dinamik kursor ma'lumotlarni tirik saqlaydi, lekin u tarmoq va dasturiy resurslarni talab qiladi. Foydalanish dinamik kursorlar manba ma'lumotlarining to'liq nusxasi yaratilmaydi, lekin foydalanuvchi ma'lum ma'lumotlarga kirgandagina manba jadvallaridan dinamik tanlash amalga oshiriladi. Qabul qilish vaqtida server qatorlarni bloklaydi va foydalanuvchi kursorning to'liq natijalar to'plamiga qilgan har qanday o'zgarishlar kursorda ko'rinadi. Biroq, kursor ma'lumotlarni olgandan keyin boshqa foydalanuvchi o'zgarishlar kiritgan bo'lsa, ular kursorda aks etmaydi.

Kursor tugmalar to'plami bilan boshqariladi, bu haddan tashqari o'rtada yotadi. Yozuvlar namuna olish vaqtida aniqlanadi va shuning uchun o'zgarishlar kuzatiladi. Ushbu turdagi kursor orqaga aylantirishni amalga oshirish uchun foydali bo'lib, ma'lumot yangilanmaguncha qator qo'shilishi va o'chirilishi ko'rinmaydi va agar unga o'zgartirishlar kiritilgan bo'lsa, haydovchi yozuvning yangi versiyasini tanlaydi.

Ketma-ket kursorlar teskari yo'nalishda ma'lumotlarni olishga ruxsat bermang. Foydalanuvchi faqat kursorning boshidan oxirigacha qatorlarni tanlashi mumkin. Ketma-ket kursor barcha qatorlar to'plamini saqlamaydi. Ular kursorda tanlangan zahoti ma'lumotlar bazasidan o'qiladi, bu INSERT , UPDATE , DELETE buyruqlari yordamida foydalanuvchilar tomonidan ma'lumotlar bazasiga kiritilgan barcha o'zgarishlarni dinamik ravishda aks ettirish imkonini beradi. Kursor ma'lumotlarning eng so'nggi holatini ko'rsatadi.

Statik kursorlar ma'lumotlarning barqaror ko'rinishini ta'minlash. Ular axborot "ombor" tizimlari uchun yaxshi: hisobot tizimlari uchun ilovalar yoki statistik va tahliliy maqsadlar uchun. Bundan tashqari, statik kursor katta hajmdagi ma'lumotlarni tanlash bilan boshqalarga qaraganda yaxshiroq ishlaydi. Aksincha, elektron xaridlar yoki chiptalarni bron qilish tizimlarida o'zgarishlar kiritilganda yangilangan ma'lumotlarni dinamik ravishda qabul qilish kerak. Bunday hollarda foydalaning dinamik kursor. Ushbu ilovalarda uzatiladigan ma'lumotlar miqdori odatda kichik bo'lib, ularga kirish satrlar (individual yozuvlar) darajasida amalga oshiriladi. Guruhga kirish juda kam uchraydi.

MS SQL Server muhitida kursorni boshqarish

Kursorni boshqarish quyidagi buyruqlarni bajarish orqali amalga oshiriladi:

  • DECLARE - yaratish yoki kursor deklaratsiyasi;
  • OCHIQ- kursor ochilishi, ya'ni. uni ma'lumotlar bilan to'ldirish;
  • FETCH- kursordan oling va kursor yordamida ma'lumotlar qatorlarini o'zgartirish;
  • YAPISH- kursorni yopish;
  • BERISH - kursorni bo'shatish, ya'ni. kursorni ob'ekt sifatida o'chirish.

Kursor deklaratsiyasi

SQL standarti kursor yaratish uchun quyidagi buyruqni beradi:

INSENSITIVE kalit so'zidan foydalanish yaratiladi statik kursor. Ma'lumotlar o'zgarishi ruxsat berilmaydi, bundan tashqari, boshqa foydalanuvchilar tomonidan kiritilgan o'zgarishlar ko'rsatilmaydi. Agar INSENSITIVE kalit so'zi mavjud bo'lmasa, an dinamik kursor.

SCROLL kalit so'zini belgilash orqali yaratilgan kursorni istalgan yo'nalishda aylantirish mumkin, bu esa har qanday tanlash buyruqlarini qo'llash imkonini beradi. Agar bu argument o'tkazib yuborilsa, kursor bo'ladi izchil, ya'ni. uni ko'rish faqat bitta yo'nalishda - boshidan oxirigacha mumkin bo'ladi.

SELECT iborasi SELECT so'rovining asosiy qismini belgilaydi, bu kursor qatorlarining natijalar to'plamini aniqlash uchun ishlatiladi.

FOR READ_ONLY argumentini belgilash faqat o'qish uchun kursorni yaratadi va ma'lumotlarga hech qanday o'zgartirish kiritishga ruxsat bermaydi. U statikdan farq qiladi, garchi ikkinchisi ham ma'lumotlarni o'zgartirishga ruxsat bermaydi. Kursor faqat o'qish uchun e'lon qilinishi mumkin dinamik kursor, bu boshqa foydalanuvchi tomonidan kiritilgan o'zgarishlarni ko'rsatadi.

FOR UPDATE argumenti bilan kursor yaratish kursorda bajarish imkonini beradi ma'lumotlar o'zgarishi ko'rsatilgan ustunlarda yoki OF argumenti bo'lmaganda ustun_nomi , barcha ustunlarda.

MS SQL Server muhitida kursor yaratish buyrug'i uchun quyidagi sintaksis qabul qilinadi:

<создание_курсора>::= SELECT_statement UCHUN kursor_nomini E'lon qiling ]]

LOCAL kalit so'zidan foydalanish faqat paket, trigger, saqlangan protsedura yoki uni yaratgan foydalanuvchi tomonidan belgilangan funksiya ichida ko'rinadigan mahalliy kursorni yaratadi. Paket, trigger, protsedura yoki funksiya tugasa, kursor bilvosita yo'q qilinadi. Kursor mazmunini uni yaratgan konstruksiyadan tashqariga o‘tkazish uchun uning parametriga OUTPUT argumentini belgilash kerak.

Agar GLOBAL kalit so'zi ko'rsatilgan bo'lsa, global kursor yaratiladi; u joriy ulanish yopilguncha mavjud.

FORWARD_ONLY belgilanishi yaratiladi ketma-ket kursor; ma'lumotlardan faqat birinchi qatordan oxirgi qatorgacha bo'lgan yo'nalishda namuna olish mumkin.

SCROLL ni belgilash yaratiladi aylantiriladigan kursor; ma'lumotlarga istalgan tartibda va istalgan yo'nalishda kirish mumkin.

STATIC yaratishni belgilash statik kursor.

KEYSET-ni belgilash kalit kursorini yaratadi.

DYNAMIC yaratishni belgilash dinamik kursor.

READ_ONLY kursor uchun FAST_FORWARD argumentini belgilasangiz, yaratilgan kursor ma'lumotlarga tezkor kirish uchun optimallashtiriladi. Bu argumentni FORWARD_ONLY va OPTIMIST argumentlari bilan birgalikda ishlatib bo‘lmaydi.

OPTIMISTIC argumenti bilan yaratilgan kursor o'zgartirilgan qatorlarni o'zgartirish va o'chirishni oldini oladi. kursor ochilishi.

TYPE_WARNING argumenti bilan server, agar u SELECT so'roviga mos kelmasa, kursor turini yashirin o'zgartirish haqida foydalanuvchiga xabar beradi.

Kursorni ochish

Uchun kursor ochilishi va SELECT so'rov kursorini yaratishda belgilangan ma'lumotlar bilan to'ldirish uchun quyidagi buyruq ishlatiladi:

Keyin kursor ochilishi tegishli SELECT operatori bajariladi, uning chiqishi qatlamli xotirada saqlanadi.

Kursordan ma'lumotlarni olish

Keyin darhol kursor ochilishi uning mazmunini (tegishli so'rov natijasi) quyidagi buyruq bilan tanlashingiz mumkin:

FIRST ni belgilash to'liq kursor natijalari to'plamining birinchi qatorini qaytaradi, bu joriy qatorga aylanadi.

LAST ni belgilash kursorning eng oxirgi qatorini qaytaradi. Shuningdek, u joriy qatorga aylanadi.

NEXT ni belgilash to'liq natijalar to'plamidagi joriy qatordan keyingi qatorni darhol qaytaradi. Endi u dolzarb bo'lib qoladi. Odatiy bo'lib, FETCH buyrug'i qatorlarni olishning ushbu usulidan foydalanadi.

PRIOR kalit so'zi joriydan oldingi qatorni qaytaradi. U joriy bo'ladi.

Dalil ABSOLUTE (satr_raqami | @satr_raqami_oʻzgaruvchisi) kursorning to'liq natijalar to'plamidagi mutlaq tartib bilan qatorni qaytaradi. Satr raqami doimiy yoki satr raqamini saqlaydigan o'zgaruvchi nomi sifatida ko'rsatilishi mumkin. O'zgaruvchi butun sonli ma'lumotlar turiga ega bo'lishi kerak. Ham ijobiy, ham salbiy qiymatlar ko'rsatilgan. Agar siz ijobiy qiymatni belgilasangiz, satr to'plamning boshidan, salbiy qiymat - oxiridan hisoblanadi. Tanlangan chiziq joriy qatorga aylanadi. Agar null belgilansa, hech qanday satr qaytarilmaydi.

Dalil RELATIVE (satr_raqami | @satr_raqami_oʻzgaruvchisi) joriy satrdan keyin belgilangan qatorlar soni bo'lgan qatorni qaytaradi. Agar siz qatorlar soni uchun manfiy qiymatni belgilasangiz, joriy satrdan oldingi qatorlar soni ko'rsatilgan qator qaytariladi. Nullni belgilash joriy qatorni qaytaradi. Qaytarilgan qator joriy qatorga aylanadi.

Kimga global kursorni oching, uning nomidan oldin GLOBAL kalit so'zini talab qiladi. Kursor nomini o'zgaruvchi yordamida ham belgilash mumkin.

Qurilishda INTO @variable_name [,...n] qaytarilgan qatorning tegishli ustun qiymatlari saqlanadigan o'zgaruvchilar ro'yxati ko'rsatilgan. O'zgaruvchilarning tartibi kursordagi ustunlar tartibiga, o'zgaruvchining ma'lumotlar turi esa kursor ustunidagi ma'lumotlar turiga mos kelishi kerak. Agar INTO konstruksiyasi belgilanmagan bo'lsa, FETCH buyrug'ining harakati SELECT buyrug'ining xatti-harakatiga o'xshaydi - ma'lumotlar ekranda aks etadi.

Ma'lumotlarni o'zgartirish va o'chirish

Kursor yordamida o'zgartirishlar kiritish uchun siz quyidagi formatda UPDATE buyrug'ini berishingiz kerak:

Kursorning joriy satrining bir nechta ustunlari bitta operatsiyada o'zgartirilishi mumkin, ammo ularning barchasi bitta jadvalga tegishli bo'lishi kerak.

Kursor yordamida ma'lumotlarni o'chirish uchun quyidagi formatda DELETE buyrug'idan foydalaning:

Natijada, kursordagi oqim o'rnatilgan chiziq o'chiriladi.

Kursor yopish

Yopilgandan so'ng, kursor dastur foydalanuvchilari uchun mavjud bo'lmaydi. Yopish paytida uning ishlashi davomida o'rnatilgan barcha qulflar olib tashlanadi. Yopish faqat ochiq kursorlarga qo'llanilishi mumkin. yopiq, lekin emas erkin kursor qayta ochilishi mumkin. Ochilmagan kursorni yopishga ruxsat berilmaydi.

Kursorni bo'shatish

Kursor yopish ixtiyoriy ravishda u bilan bog'langan xotirani chiqaradi. Ba'zi ilovalarda siz uni DEALLOCATE bayonoti bilan aniq ajratishingiz kerak. Keyin kursorni bo'shatish xotira ham bo'shatiladi va kursor nomi qayta ishlatilishi mumkin.

Kursorning oxiriga yetganini nazorat qilish uchun funktsiyadan foydalanish tavsiya etiladi: @@FETCH_STATUS

@@FETCH_STATUS funksiyasi quyidagilarni qaytaradi:

0 agar olish muvaffaqiyatli bo'lsa;

1 kursordan tashqaridagi qatorni olishga urinish tufayli olib kelish muvaffaqiyatsiz bo'lsa;

2, agar o'chirilgan yoki o'zgartirilgan qatorga kirishga urinish tufayli olish muvaffaqiyatsiz bo'lsa.

DECLARE @id_kl INT, @firm VARCHAR(50), @fam VARCHAR(50), @message VARCHAR(80), @nam VARCHAR(50), @d DATETIME, @p INT, @s INT SET @s=0 PRINT "Xarid ro'yxati" mijoz_kursorini TANLASH UCHUN MAHALLIY KURSORNI E'lon qiling. Mijoz ID, Kompaniya, Familiya Mijoz QAYERDAN BUYURTDI City="Moskva" Kompaniya BUYURTDI, Familiya Ochiq klient_kursor KEYINGI klient_kursordan @id_kl, @firm, @AT@FET. =0 BEGIN SELECT @message="Mijoz" [elektron pochta himoyalangan]+ "Kompaniya"+ @firm PRINT @message SELECT @message="Mahsulot nomi Sotib olish sanasi narxi" PRINT @message Tovar_kursor E'lon E'lon qiling tovar_kursor Buyum.Nomi, Savdo.Sanasi, Narxi*Savdo.Miqdorini TANLASH UCHUN ICHKI JOYNING XARAJATLARI Tovarlar bo'yicha tranzaksiya. ItemCode=Deal.ItemCode WHERE Deal.CustomerCode [elektron pochta himoyalangan] _kl OCHIQ tovar_kursorni tovar_kursordan KEYINGI INTO @nam, @d, @p AGAR @@FETCH_STATUS.<>0 PRINT "Xaridlar yo'q" WHILE @@FETCH_STATUS=0 TALANLASH @message=" " [elektron pochta himoyalangan]+" "+ YUKLASH(@d CHAR(12) ASKI)+" "+ TURMUSH(@p CHAR(6) ASKI) @xabarni SOZLASH @ [elektron pochta himoyalangan][elektron pochta himoyalangan] Tovar_cursorDAN KEYINGI KELISH @nam, @d, @p END YOPISH tovar_cursor BOSHQARISh tovar_cursor SELECT @message="Jami xarajat "+ CAST(@s CHAR(6) AS) PRINT @xabar -- keyingi mijozga o'tish-- KEYINGI OLISH klient_kursordan @id_kl, @firm, @fam GA TUG'ADI klient_kursorni yopadi. 13.6-misol. Moskvadan xaridorlar tomonidan sotib olingan tovarlar ro'yxati va ularning umumiy narxini ko'rsatish uchun kursor.

13.7-misol. Moskvadan kelgan mijozlar uchun aylantiriladigan kursorni ishlab chiqing. Agar telefon raqami 1 bilan boshlangan bo'lsa, ushbu raqam bilan mijozni olib tashlang va birinchi kursor yozuvida telefon raqamining birinchi raqamini 4 bilan almashtiring.

E'lon qiling @firm VARCHAR(50), @fam VARCHAR(50), @tel VARCHAR(8), @message VARCHAR(80) "Mijozlar ro'yxati" ni E'lon qiling klient_kursor KURSOR GLOBAL SROLL TO'PLAMNI TANLASH Kompaniya, Familiya, Telefon F. QAYERDA Shahar ="Moskva" FIRMA BUYURTDI, Familiya YANGILANISH UCHUN klient_kursorni Oching klient_kursordan KEYINGI @firm, @fam, @tel OLISH @@FETCH_STATUS=0 BAGIN TANILA @message="Mijoz" [elektron pochta himoyalangan]+ "Fikr" [elektron pochta himoyalangan]" Telefon "+ @tel PRINT @message -- agar telefon raqami 1 dan boshlansa -- shu raqamga ega bo'lgan mijozni o'chiring AGAR @tel '1%' YOQSA Klientni o'chiring mijoz_kursor BOSHQA QERDA -- keyingi mijozga o'ting klient_kursordan KEYINGI KIRISH. @firm, @fam, @tel TUGANING mijoz_kursoridan @firm, @fam, @tel GA ABSOLUTE 1 OLING -- birinchi kirishda, birinchi raqamni -- telefon raqamini 4 ta YANGILANISH Client SET Phone='4' + O'NG( @tel,LEN(@tel)-1)) klient_kursorning HOZIRGI QAYERDA SELECT @message="Mijoz" [elektron pochta himoyalangan]+" Firma "+ @firm " Telefon "+ @tel PRINT @xabar klient_kursorni YAPISH klient_kursorni BOSHLASH 13.7-misol. Moskvadan kelgan mijozlar uchun aylantiriladigan kursor.

13.8-misol. Foydalanish kursor protseduraning chiqish parametri sifatida. Jarayon ma'lumotlar to'plamini qaytaradi - tovarlar ro'yxati.

Chiqish kursoridan protsedurani chaqirish va ma'lumotlarni chop etish quyidagicha amalga oshiriladi:

DECLARE @my_cur KURSOR E'lon qilish @n VARCHAR(20) EXEC my_proc @ [elektron pochta himoyalangan] _cur @my_cur dan KEYINGI OLISH @n SELECT @n (@@FETCH_STATUS=0) KEYINGI @my_cur INTO INTO OLISHNI BOSHLASH @n SELECT @n TUGASH @my_cur BOSHQARISh @my_cur

Rebeka M. Riordan "Transact-SQL-dagi kursorlar"

Internet axborot texnologiyalari universiteti

http://www.INTUIT.ru

O'quv kursi: "Microsoft SQL Server 2000 da dasturlash"

Kursor dasturlar va saqlangan protseduralarda foydalanish uchun mo'ljallangan maxsus vaqtinchalik SQL ob'ektidir. Uning yordamida siz so'rovlar qatorlarining natijalar to'plamini aylanib chiqishingiz, uning har bir qatorini alohida o'qish va qayta ishlashingiz mumkin. Saqlangan protseduralarda SELECT operatorining sintaksisi yordamida ifodalash qiyin bo'lgan murakkab hisoblarni bajarish uchun kursorlardan foydalanishingiz mumkin. Darsning katta nazariy materiali juda yaxshi misollar bilan to'ldiriladi. Xususan, CURSOR_STATUS funksiyasining qo‘llanilishi, @@CURSOR_ROWS va @@FETCH_STATUS o‘zgaruvchilari tavsifi va boshqa ko‘p narsalar ko‘rib chiqiladi.

Siz o'rganasiz:

  • kursorni e'lon qilish;
  • kursorni ochish;
  • kursorni yopish;
  • kursorni qo'yib yuboring;
  • oddiy FETCH buyrug'idan foydalaning;
  • o'zgaruvchilarga qatorni olish;
  • satrni mutlaq holati bo'yicha tanlang;
  • nisbiy joylashuvi bo'yicha qatorni tanlang;
  • pozitsiyani o'zgartirishni amalga oshirish;
  • pozitsion o'chirishni amalga oshirish;
  • kursor to'plamidagi qatorlar sonini aniqlash uchun @@CURSOR_ROWS global o'zgaruvchisidan foydalaning;
  • FETCH buyrug'ining natijalarini aniqlash uchun @@FETCH_STATUS global o'zgaruvchisidan foydalaning;
  • kursor holatini so'rash uchun CURSOR_STATUS funksiyasidan foydalaning.

Relyatsion ma'lumotlar bazalarining xarakterli xususiyatlaridan biri shundaki, amallar qatorlar to'plamida bajariladi. To'plam bo'sh bo'lishi yoki faqat bitta qatorni o'z ichiga olishi mumkin, lekin u baribir to'plam hisoblanadi. Bu aloqador operatsiyalar uchun zarur va foydali xususiyatdir, lekin ba'zan ilovalar uchun noqulay bo'lishi mumkin.

Misol uchun, to'plamdagi ma'lum bir qatorga ishora qilishning imkoni yo'qligi sababli, foydalanuvchiga qatorlarni birma-bir taqdim etish qiyin bo'lishi mumkin. Transact-SQL tomonidan standart SQL tiliga taqdim etilgan kengaytmalar ko'proq dasturlash imkoniyatlariga ega bo'lishiga qaramay, belgilangan printsiplar asosida amalga oshirish qiyin, vaqt talab qiladigan yoki hatto imkonsiz bo'lgan operatsiyalar mavjud.

Bunday vaziyatlarni hal qilish uchun SQL kursorlarni taqdim etadi. Kursor - bu to'plamdagi ma'lum bir qatorga ishora qiluvchi ob'ekt. Siz yaratgan kursorning xususiyatiga qarab, kursorni to'plam ichida harakatlantirishingiz va ma'lumotlarni o'zgartirishingiz yoki o'chirishingiz mumkin.

Kursorlar haqida tushuncha

Microsoft SQL Server aslida ikki xil turdagi kursorlarni qo'llab-quvvatlaydi: Transact-SQL kursorlari va API kursorlari (dastur dasturlash interfeysi kursorlari). API kursorlari Microsoft ActiveX Data Objects (ADO), OLE DB, ODBC yoki DB-Library dan foydalanadigan dastur ichida yaratilgan. Ushbu API'larning har biri biroz boshqacha funksiyalarni qo'llab-quvvatlaydi va boshqa sintaksisdan foydalanadi. Biz bu yerda Cursors API-ni batafsil muhokama qilmaymiz; agar siz ulardan foydalanishni rejalashtirmoqchi bo'lsangiz, API va siz foydalanmoqchi bo'lgan dasturlash tili uchun tegishli hujjatlarga qarang.

Transact-SQL kursorlari DECLARE CURSOR buyrug'i yordamida yaratiladi. Kursor ob'ekti ham, u ko'rsatadigan qatorlar to'plami ham serverda mavjud bo'lishi kerak. Bunday kursorlar server kursorlari deb ataladi. Agar siz tarmoq orqali SQL Serverga ulangan ilovadan server kursoridan foydalansangiz, kursorning har bir operatsiyasi ikki tomonlama tarmoq aloqasini talab qiladi. Server kursorlarini qo'llab-quvvatlaydigan Cursor API kutubxonalari, shuningdek, mijoz tizimida mavjud bo'lgan mijoz kursorini qo'llab-quvvatlaydi va mijozda ishlov beradigan satrlarni keshlaydi.

Kursor tomonidan ko'rsatilgan qatorlar to'plami SELECT buyrug'i yordamida aniqlanadi. Transact-SQL kursorini yaratishda SELECT bayonotida bir nechta cheklovlar mavjud:

SELECT buyrug'i bir nechta natijalar to'plamini qaytara olmaydi;

SELECT buyrug'i yangi jadval yaratish uchun INTO bandini o'z ichiga olmaydi;

SELECT buyrug'i natijalarni jamlash uchun ishlatiladigan COMPUTE yoki COMPUTE BY bandini o'z ichiga olmaydi. (Biroq, u AVG kabi yig'ish funktsiyalarini o'z ichiga olishi mumkin.)

Kursor xususiyatlari

Transact-SQL bir necha turdagi kursorlarni qo'llab-quvvatlaydi. Kursorlarning har birining turli xususiyatlarini aniqlash juda zerikarli ishdir, ammo agar kursorning har bir turi uchun uchta ko'proq yoki kamroq mustaqil xususiyatni hisobga olsak, buni osonlashtirish mumkin: manba ma'lumotlaridagi o'zgarishlarni aks ettirish qobiliyati, bir nechta satrlar bo'ylab aylantirish qobiliyati va bir nechta satrlarni o'zgartirish qobiliyati.

O'zgarishlarni aks ettirish

Kursorning ma'lumotlardagi o'zgarishlarni aks ettirish qobiliyati kursor sezgirligi deb ataladi. Aytaylik, siz bayonot uchun kursor yaratdingiz:

SELECT * FROM Oils WHERE Chap(OilName, 1) = "B" Aromaterapiya ma'lumotlar bazasi 1-rasmda ko'rsatilganidek, to'rt qatorni qaytaradi. Agar kursordan foydalanayotganingizda, kimdir Bergamot elementi uchun Tavsif qiymatini qo'shsa yoki Bayberry elementi uchun satr qo'shsa, kursoringiz ko'rsatgan qatorlar to'plamiga nima bo'ladi?

Guruch. 1. Aromaterapiya ma'lumotlar bazasi B harfi bilan boshlangan to'rtta qatorni o'z ichiga oladi.

Kursorni yaratganingizda, sezgirlikning ikki turi mustaqil ravishda belgilanishi mumkin: to'plamga qaysi qatorlar kiritilganligi (to'plam a'zoligi) va o'zgarishlarning asl satrlarda aks ettirilganligi.

aylantirish

Kursorning ikkinchi xususiyati ham oldinga, ham orqaga yoki faqat oldinga siljish qobiliyatidir. Bu erda dasturlashning qadimgi dilemmasi mavjud: tezlik va moslashuvchanlik. Ketma-ket kursorlar (faqat oldinga siljish) ancha tezroq, lekin kamroq moslashuvchanlikka ega.

Yangilash

Kursorlarni tasniflashda foydalaniladigan oxirgi xususiyat kursor orqali qatorlarni yangilash qobiliyatidir. Shunga qaramay, faqat o'qish uchun kursorlar odatda ko'proq ishlaydi, lekin kamroq moslashuvchan.

Kursor turlari

Transact-SQL to'rt xil turdagi kursorlarni qo'llab-quvvatlaydi: statik, kalit, dinamik va tezkor kirish yoki "o't o'chirish" kursorlari. Har bir kursor turi o'zi ko'rsatgan qatorlar haqida turli ma'lumotlarni saqlaydi va har bir kursor turi oldingi bo'limda muhokama qilingan xususiyatlarning turli kombinatsiyalariga ega.

Statik kursorlar

Statik kursor SELECT bayonotida ko'rsatilgan ma'lumotlarning suratini oladi va uni tempdb ma'lumotlar bazasida saqlaydi. U struktura yoki ma'lumotlar qiymatlaridagi o'zgarishlarni "sezmaydi" va har qanday o'zgartirishlar faqat nusxada aks ettirilganligi sababli, bu kursor har doim faqat o'qish rejimida ochiladi. Statik kursorlar ketma-ket yoki aylantiriladigan deb e'lon qilinishi mumkin.

Kalit kursorlar

Kalit kursor tempdb ga faqat har bir satrni o'ziga xos tarzda aniqlaydigan ustunlarni ko'chiradi. Kalit kursorini e'lon qilish imkoniyatiga ega bo'lish uchun SELECT operatorining ta'rifiga kiritilgan har bir jadval nusxalanadigan to'plamni belgilaydigan yagona indeksga ega bo'lishi kerak - kalit.

Kalit kursorlar o'zgartirilishi yoki faqat o'qilishi mumkin. Ular, shuningdek, aylantiriladigan yoki ketma-ket bo'lishi mumkin.

Kalit kursorga a'zolik kursor e'lon qilingan vaqtda belgilanadi. Agar kursorning ochiq holatida tanlash shartini qanoatlantiradigan satr qo'shilsa, u to'plamga qo'shilmaydi. Oldingi misolimizda, filtr sharti sifatida LEFT(OilName, 1) = "B" ishlatilgan bo'lsa, kursor doirasi bilan bog'liq qatorlarga "Bayberry" OilName maydoni qiymatiga ega yangi qator qo'shilmaydi.

Xuddi shunday, agar qatorga oʻrnatilgan aʼzolik shartini qanoatlantirmaydigan oʻzgartirish kiritilsa, masalan, “Bazil” ni “Kumquat” ga oʻzgartirilsa, satr baribir toʻplam aʼzosi boʻlib qoladi. Agar satr o'chirilgan bo'lsa ham, u baribir to'plamning a'zosi bo'lib qoladi, lekin SQL Server barcha ustun qiymatlari uchun NULLni qaytaradi.

Kursor ochilgandan so'ng kursor to'plamining a'zoligi o'zgarmas bo'lib qolsa ham, manba jadvallariga kiritilgan ma'lumotlar qiymatlariga kiritilgan o'zgarishlar shunga qaramay o'z aksini topadi. Masalan, Bergamot satri uchun Tavsif maydonining qiymatini o'zgartirish kursor tomonidan qaytariladi. Biroq, kalitlar to'plami qiymatlariga kiritilgan o'zgarishlar kursor ichida sodir bo'lsa, kursorlarda aks etadi. Oldingi misolni davom ettirsak, agar OilName maydonining qiymati kursor ichidagi "Bazil" dan "Kumquat" ga o'zgartirilsa, kursor "Qumquat" ni qaytaradi. Agar o'zgartirish boshqa foydalanuvchi tomonidan amalga oshirilgan bo'lsa, kursor baribir "Bazil" ni qaytaradi.

Maslahat. Keyingi bo'limda ko'rib turganimizdek, kursor yaratish va kursorni ochish har xil operatsiyalardir. Kalit kursor tarkibini yangilash uchun uni yopish va qayta ochishingiz mumkin.

Dinamik kursorlar

Dinamik kursor o'zini xuddi qatorga har safar kirishda SELECT operatori qayta bajariladigandek tutadi. (Aslida, ishlar biroz boshqacha ishlaydi, ammo bu tasvir sizga dinamik kursorlarning ishlashini yaxshiroq baholash imkonini beradi.) Dinamik kursorlar ushbu o'zgarishlar tizim ichida amalga oshirilganligidan qat'i nazar, a'zolik va manba ma'lumotlarining qiymatlari bilan bog'liq o'zgarishlarni aks ettiradi. kursor yoki boshqa foydalanuvchi tomonidan kiritilgan.

Dinamik kursorlar uchun bitta cheklov mavjud: kursorni aniqlash uchun foydalaniladigan SELECT iborasi faqat ORDER BY bandida ishlatiladigan ustunlarni o'z ichiga olgan indeks mavjud bo'lsa, ORDER BY bandini o'z ichiga olishi mumkin. Agar siz indeksda ishlamaydigan ORDER BY bandidan foydalanib kalit kursorini e'lon qilsangiz, SQL Server kursorni kalit kursoriga aylantiradi.

Tez kirish kursorlari

SQL Server aylantirilmaydigan, faqat o'qish uchun kursorning maxsus, optimallashtirilgan shaklini qo'llab-quvvatlaydi. Bunday kursor FAST_FORWARD kalit so'zi yordamida e'lon qilinadi va odatda "o't o'chiruvchi" kursor deb ataladi.

Yong'in kursorlari juda samarali, ammo ulardan foydalanishda ikkita muhim cheklovlar mavjud. Birinchidan, agar siz matn, matn yoki rasm ustunlari va TOP iborasini kursor taʼrifi SELECT iborasida ishlatgan boʻlsangiz, SQL Server kursorni asosiy kursorga aylantiradi.

Ikkinchidan, agar siz kursorni belgilash uchun ishlatgan SELECT iborasida triggerlari bo'lgan jadvallar va bo'lmagan jadvallar mavjud bo'lsa, kursor statikga aylanadi. Triggerlar Transact-SQL skriptlari bo'lib, ular ma'lumotlarni manipulyatsiya qilish tili (DML) iboralari jadvaliga nisbatan bajarilganda server tomonidan avtomatik ravishda bajariladi. Triggerlarni 29-darsda batafsil ko‘rib chiqamiz, ammo hozircha quyidagi nuqtaga e’tibor qaratamiz: agar kimdir kursor ishlatadigan jadvallardan biriga trigger qo‘shsa, ilovangiz to‘satdan ishlashni to‘xtatishi mumkin, chunki SQL Server tezroq ma’lumotlarni o‘zgartiradi. kursorni sekinroq belgilang.

Kursorlardan foydalanish

Kursorlardan foydalanish mahalliy o'zgaruvchilardan foydalanishga o'xshaydi - siz ularni e'lon qilasiz, qiymat o'rnatasiz va keyin ulardan foydalanasiz. Biroq, mahalliy o'zgaruvchilardan farqli o'laroq, ular ko'lamdan chiqib ketganda avtomatik ravishda yo'q qilinadi, siz kursor tomonidan ishlatiladigan qatorlarni aniq bo'shatib, keyin kursorni yo'q qilishingiz kerak.

Kursorlarni yaratish

Kursordan foydalanishning birinchi bosqichi uni yaratishdir. Transact-SQL kursorlari DECLARE CURSOR operatori yordamida yaratiladi.

Diqqat! SQL Server kursorlarni yaratishning ikki xil usulini qo'llab-quvvatlaydi: SQL-92 sintaksisidan foydalanish va Transact-SQL sintaksisidan foydalanish. SQL-92 sintaksisi ANSI standartiga mos keladi, lekin bu yerda muhokama qilingan Transact-SQL sintaksisiga qaraganda kamroq funksionallikka ega.

DECLARE CURSOR operatori quyidagi sintaksisga ega:

Kursor_nomini KURSOR E'lon qiling

[ko'rinish]

[aylantirish]

[qulf]

Select_operator UCHUN

E'tibor bering, kursorning xususiyatlarini aniqlaydigan barcha parametrlar - ko'rinish, tur va boshqalar. - ixtiyoriy. Ushbu parametrlar uchun standart qiymatlar murakkab va manba yozuvlari yoki ko'rinishlari yoki ma'lumotlar bazasi bilan ishlash opsiyalari bilan qanday ishlashni ko'rsatishi yoki ko'rsatmasligi mumkin. Operatorni o'qish uchun qulayroq qilish uchun sizga kerak bo'lgan barcha parametrlarni aniq belgilash yaxshiroqdir. Shunday qilib, siz nimani olishingizni aniq bilib olasiz.

Kursorning ko'rinishi vaqtinchalik jadvallarni e'lon qilishda @local_table yoki @@global_table kalit so'zlari bilan bir xil ta'sirga ega bo'lgan LOCAL yoki GLOBAL kalit so'zlari yordamida aniqlanadi.

Maslahat. SQL Server mahalliy kursor doiradan chiqib ketganda (ko'rinish) yopiladi va uni qo'yib yuboradi, lekin buni har doim aniq bajargan ma'qul.

O'tkazish parametri faqat boshidan oxirigacha yoki istalgan yo'nalishda harakat qilish imkoniyatini ko'rsatadigan FORWARD_ONLY va SCROLL kalit so'zlaridan foydalanishga imkon beradi.

Type parametri yaratiladigan kursor turini belgilaydi. Yaroqli kalit so‘zlar: STATIC, KEYSET, DYNAMIC va FAST_FORWARD. FAST_FORWARD turi parametri va FORWARD_ONLY aylantirish parametri bir-birini istisno qiladi.

Qulflash opsiyasi satrlarni kursor tomonidan o'zgartirilishi mumkinligini va agar shunday bo'lsa, boshqa foydalanuvchilar tomonidan o'zgartirilishi mumkinligini aniqlaydi. Agar READ_ONLY kalit so'zi ishlatilsa, kursor dastlabki ma'lumotlarga hech qanday o'zgartirish kirita olmaydi. Biroq, boshqa foydalanuvchilar ma'lumotlarni o'zgartirishi mumkin yoki siz UPDATE bayonoti yordamida buni o'zingiz qilishingiz mumkin. Agar blokirovka parametri sifatida SCROLL_LOCKS belgilansa, yangilanishlar faqat kursor yordamida amalga oshirilishi mumkin. Xuddi shu paketdagi yoki boshqa foydalanuvchilar tomonidan taqdim etilgan barcha boshqa UPDATE bayonotlari muvaffaqiyatsiz bo'ladi.

Oxirgi blokirovka opsiyasi, OPTIMISTIC, kursor ichida ham, tashqarisida ham qatorni yangilash imkonini beradi. Bu eng moslashuvchan variant, lekin kursor tomonidan o'qilganidan beri chiziq o'zgartirilgan bo'lsa, kursor tomonidan kiritilgan o'zgartirish har doim muvaffaqiyatsiz bo'lishi ehtimoli bor.

TYPE_WARNING parametri kursor turi belgilangan turdan boshqa turga aylantirilsa, SQL Serverga mijozga ogohlantirish xabarini yuborishni buyuradi. Agar siz berilgan SELECT iborasini qo'llab-quvvatlamaydigan kursorni e'lon qilsangiz, bu mumkin.

FOR bandida ko'rsatilgan select_operator parametri talab qilinadi. U kursorlar majmuasiga kiritiladigan qatorlarni belgilaydi.

FOR UPDATE bandi ixtiyoriy. READ_ONLY oʻrnatilmasa, kursorlar sukut boʻyicha oʻzgartirilishi mumkin, ammo natijaga ishonch hosil qilish uchun bu iborani ishlatgan maʼqul. Siz o'zgartirishga ruxsat beradigan maxsus qatorlarni belgilash uchun ustun_nomlarining OF bandidan foydalanishingiz mumkin. Agar ustun_nomlarining OF bo'limini o'tkazib yuborsangiz, o'zgartirish SELECT iborasida ko'rsatilgan barcha ustunlarda amalga oshirilishi mumkin.

Kursor o'zgaruvchilari

Transact-SQL CURSOR tipidagi o'zgaruvchilarni e'lon qilish imkonini beradi. Bu holda standart DECLARE sintaksisi kursor yaratmaydi; kursor uchun o'zgaruvchini SET kalit so'zidan foydalanib aniq belgilashingiz kerak.

myCursor KURSORNI E'lon qilish

Yog'lardan yog' nomini tanlash uchun

@myCursorVariable KURSORNI E'lon qiling

SET @myCursorVariable = myCursor

Agar siz turli kursorlarga tayinlanishi mumkin bo'lgan o'zgaruvchilar yaratmoqchi bo'lsangiz, ushbu sintaksis foydalidir. Turli natijalar to'plamlari bilan ishlash uchun umumiy protsedura yaratayotgan bo'lsangiz, bu talab qilinishi mumkin.

Siz kursor o'zgaruvchisini e'lon qilishingiz va undan so'ng to'g'ridan-to'g'ri kursor yaratish uchun foydalanishingiz mumkin.

@myCursorVariable KURSOR TO'LOMI @myCursorVariable NI E'lon qiling = KURSOR MOG'LARDAN MOQ NOMINI TANLASH UCHUN MAHALLIY TEZKOR_O'G'RIGA E'lon qiling

Ushbu sintaksis bilan kursorda identifikator yo'q va faqat o'zgaruvchi orqali murojaat qilish mumkin.

Kursorni ochish

Kursor deklaratsiyasi kursor ob'ektini yaratadi, lekin kursor boshqaradigan yozuvlar to'plamini yaratmaydi (kursor to'plami). Kursorni ochmaguningizcha, kursor to'plami yaratilmaydi. DECLARE CURSOR bayonotining ancha murakkab sintaksisidan so'ng, bayonot sintaksisi juda shaffof ko'rinadi:

Kursorni_yoki_o'zgaruvchini Oching

GLOBAL kalit so'zi ziddiyatlarning oldini olishga yordam beradi: agar LOCAL kalit so'zi bilan e'lon qilingan kursor va GLOBAL kalit so'zi bilan e'lon qilingan kursor bir xil identifikatorga ega bo'lsa, GLOBAL kalit so'zidan foydalanmasangiz, kursorga havolalar sukut bo'yicha mahalliy kursorga o'tadi. Boshqa shunga o'xshash holatlarda bo'lgani kabi, agar siz global kursorni ochayotgan bo'lsangiz, kalit so'zni aniq ko'rsatgan ma'qul.

Kursor yopish

Kursordan foydalanishni tugatgandan so'ng, uni yopishingiz kerak. CLOSE bayonoti kursorlar to'plamini saqlash uchun foydalaniladigan resurslarni chiqaradi va agar siz DECLARE bayonotida SCROLLOCKS opsiyasidan foydalansangiz, satrlarda saqlangan har qanday qulflarni chiqaradi. CLOSE buyrug'ining sintaksisi OPEN bayonotining sintaksisi bilan deyarli bir xil - faqat kalit so'z o'zgaradi:

Kursor_yoki_oʻzgaruvchini YAPISH

Kursorni bo'shatish

Kursorni yaratish ketma-ketligidagi oxirgi bayonot DEALLOCATE operatoridir. Uning sintaksisi ham oddiy:

Kursorni_yoki_o'zgaruvchini BO'LASH

Biroq, bu erda bir noziklik bor: DEALLOCATE iborasi identifikator yoki kursor o'zgaruvchisini o'chiradi, lekin kursorning o'zini o'chirishi shart emas. Kursorning o'zi unga ishora qiluvchi barcha identifikatorlar bo'shatilmaguncha yoki muddati tugamaguncha o'chirilmaydi (ko'rsatkichdan tashqarida). Quyidagi misollarni ko'rib chiqing:

Kursor yaratish myCursor KURSOR KEYSETNI READ_ONLY FOR SELECT * FROM Oils -- kursor oʻzgaruvchisini yaratish DECLARE @cursorVariable KURSOR -- Kursor yozuvlari toʻplamini yaratish OPEN myCursor -- Kursorga oʻzgaruvchini belgilash SET @kursorVari = ReyCursor- kursor myCursorni BOSHQARISH

Kursor bo'shatilgandan so'ng, myCursor identifikatori endi kursorlar to'plami bilan bog'lanmaydi, lekin kursor to'plami hali ham @cursorVariable o'zgaruvchisi tomonidan havola qilinganligi sababli, kursor va kursor to'plami bo'shatilmaydi. Kursor o'zgaruvchisini ham aniq bo'shatmaguningizcha, kursor va kursor to'plami o'zgaruvchining amal qilish muddati tugaguncha mavjud bo'ladi.

Kursor yordamida satrlarni boshqarish

Kursorlar o'z-o'zidan hech qanday qiziqish uyg'otmaydi, agar ular bilan biror narsa qila olmasangiz. Transact-SQL uch xil kursor buyruqlarini qo'llab-quvvatlaydi: FETCH, UPDATE va DELETE.

FETCH buyrug'i kursor qatorlari to'plamidan belgilangan qatorni oladi. Eng oddiy shaklda FETCH buyrug'i quyidagi sintaksisga ega:

FETCH kursor yoki o'zgaruvchi

Ushbu yozuv formati kursor joyidagi satrni qaytaradi (joriy qator).

Oddiy FETCH buyrug'idan foydalaning

  1. Ildiz katalogidagi SQL 2000 Step by Step papkasiga o'ting, SimpleCursor nomli skriptni belgilang va Ochish tugmasini bosing.
  2. Query Analyzer skriptni Query oynasiga yuklaydi.

Maslahat. Ushbu skript tegishli SELECT iborasidan ko'proq vaqt talab qilishini payqagan bo'lishingiz mumkin. Gap shundaki, kursorni yaratish va ochish qo'shimcha vaqtni talab qiladi. Agar vazifani bajarish uchun SELECT iborasi etarli bo'lsa, hech qachon kursordan foydalanmang.

FETCH buyrug'i nafaqat satrni to'g'ridan-to'g'ri qaytarishi mumkin, balki qaytarilgan ustundagi qiymatlarni o'zgaruvchilarda saqlashga imkon beradi. FETCH buyrug'i natijalarini o'zgaruvchida saqlash uchun quyidagi sintaksisdan foydalaning:

Kursor_yoki_o'zgaruvchini o'zgaruvchilar_ro'yxatiga KECH

Variable_list - bu o'zgaruvchilar identifikatorlarining vergul bilan ajratilgan ro'yxati. FETCH buyrug'ini bajarishdan oldin siz o'zgaruvchilarni e'lon qilishingiz kerak. Varlist kursorni belgilaydigan SELECT iborasida paydo bo'ladigan har bir ustun uchun o'zgaruvchini o'z ichiga olishi kerak. O'zgaruvchining ma'lumotlar turi ustunning ma'lumotlar turiga mos kelishi yoki mos kelishi kerak.

O'zgaruvchilarga yozish bilan qatorlarni tanlang

Oldingi barcha misollarda FETCH iborasi joriy qatorni qaytarish uchun ishlatilgan. FETCH bayonotining sintaksisi boshqa qatorni belgilash uchun bir qator kalit so'zlarni ham ta'minlaydi. Ushbu kalit so'zlardan foydalanganda FETCH iborasi berilgan qatorni qaytaradi va uni joriy qatorga aylantiradi.

Ushbu kalit so'zlar kursor to'plamida mutlaq pozitsiyani belgilashga imkon beradi. FIRST va LAST kalit so'zlari mos ravishda birinchi va oxirgi qatorlarni qaytaradi, ABSOLUTE n esa kursor yozuvlari to'plamining boshidan (agar n ijobiy bo'lsa) yoki oxiridan (agar n salbiy bo'lsa) n qatorni belgilaydi. n qiymati doimiy (3) yoki o'zgaruvchi (@theRow) sifatida ifodalanishi mumkin.

Mutlaq holati bo'yicha qatorlarni tanlang

  1. FetchAbsolute nomli skriptni belgilang va Ochish tugmasini bosing. Query Analyzer skriptni Query oynasiga yuklaydi.

FETCH iborasi qatorlarni mutlaq joylashuvi bo‘yicha olish imkonini beruvchi kalit so‘zlardan tashqari, joriy qatorga nisbatan o‘z o‘rni bo‘yicha qatorlarni olish imkonini beruvchi uchta kalit so‘zni taqdim etadi. FETCH NEXT operatori keyingi qatorni, FETCH PRIOR operatori oldingi qatorni, FETCH RELATIVE n operatori joriy qatordan n qatorni qaytaradi. FETCH ABSOLUTE n iborasi kabi, FETCH RELATIVE n operatori, agar n salbiy bo'lsa, joriy qatordan oldin qatorlarni va n ijobiy bo'lsa, joriy qatordan keyingi qatorlarni belgilashi mumkin.

Qatorlarni nisbiy joylashuviga qarab tanlang

  1. FetchRelative nomli skriptni belgilang va Ochish tugmasini bosing. Query Analyzer skriptni Query oynasiga yuklaydi.

Agar kursor FORWARD_ONLY yoki PAST_FORWARD turida bo'lsa, pozitsiyani ko'rsatish uchun faqat NEXT kalit so'zidan foydalanish mumkin. Aslida, agar kursor shu turlardan biri bo'lsa, NEXT kalit so'zi kerak emas. SQL Server har bir FETCH bayonoti aslida FETCH NEXT bayonoti deb hisoblaydi.

Tez kursor uchun FETCH NEXT iborasidan foydalaning

  1. FetchFirehose nomli skriptni belgilang va Ochish tugmasini bosing. Query Analyzer skriptni Query oynasiga yuklaydi.

Query Analyzer asboblar panelidagi Run Query tugmasini bosing. Query Analyzer so'rovni bajaradi.

Kursorlar orqali qatorlarni o'zgartirish va o'chirish

Agar kursoringiz o'zgartirilishi mumkin bo'lsa. Kursor to'plamidagi boshlang'ich qiymatlarni o'zgartirish juda oddiy. Kursor orqali o'zgartirishni qo'llab-quvvatlaydigan WHERE bandining maxsus shakli mavjud:

YANGILANISh jadvali_yoki_koʻrish_toʻplam roʻyxatini_oʻzgartirish_to_kursor_yoki_oʻzgaruvchining HOZIRGI QERDA

Bu pozitsion yangilanish deb ataladi. Transact-SQL shuningdek quyidagi belgilarga ega bo'lgan pozitsion o'chirishni qo'llab-quvvatlaydi:

Kursor yoki o'zgaruvchining HOZIRGI QAYERDA jadval_yoki_ko'rinishni O'CHIRISH

Pozitsiyaviy yangilanishni amalga oshiring

  1. PositionedUpdate nomli skriptni belgilang va Ochish tugmasini bosing. Query Analyzer skriptni Query oynasiga yuklaydi.

Query Analyzer asboblar panelidagi Execute Query tugmasini bosing. Query Analyzer so'rovni bajaradi. E'tibor bering, ikkita panjara paneli ko'rsatiladi. Birinchisi FETCH bayonoti tomonidan yaratilgan va ustunlarning dastlabki mazmunini o'z ichiga oladi. Ikkinchisi SELECT operatorining natijasi bo'lib, o'zgartirishdan keyin Tavsif maydonining qiymatini o'z ichiga oladi.

Transact-SQL kursorlarini kuzatish

Transact-SQL ikkita global o'zgaruvchini va kursoringizning ishlashini va holatini boshqarishga yordam beradigan funktsiyani taqdim etadi. @@CURSOR_ROWS o'zgaruvchisi ulanishda ochilgan oxirgi kursor to'plamidagi qatorlar sonini qaytaradi. @@CURSOR_ROWS tomonidan qaytarilgan qiymatlar 1-jadvalda ko'rsatilgan.

@@FETCH_STATUS o'zgaruvchisi oxirgi FETCH buyrug'ining bajarilishi haqidagi ma'lumotlarni qaytaradi. 2-jadvalda @@FETCH_STATUS o'zgaruvchisi tomonidan qaytarilgan qiymatlar ko'rsatilgan.

Nihoyat, Transact-SQL CURSOR_STATUS funksiyasini taqdim etadi. Bu funksiya quyidagi sintaksisga ega:

KURSOR_STATUS(turi, kursor_yoki_oʻzgaruvchi) Turi “mahalliy”, “global” yoki “oʻzgaruvchi” boʻlishi mumkin va kursor_yoki_oʻzgaruvchi — olinadigan kursor yoki kursor oʻzgaruvchisining identifikatori. CURSOR_STATUS funksiyasi tomonidan qaytarilgan natijalar 3-jadvalda keltirilgan.

Kursorni kuzatish xususiyatlaridan foydalaning

  1. StatusFunctions skriptini belgilang va Ochish tugmasini bosing. Query Analyzer skriptni Query oynasiga yuklaydi.

chop etish versiyasi

Kursor - bu SELECT operatori tomonidan qaytarilgan natijalar to'plamidagi qatorlarni alohida qayta ishlash imkonini beruvchi ob'ekt. Transact-SQL tilida qo'llab-quvvatlanadigan kursorlar keyingi muhokama qilinadi. Bular ma'lumotlar bazasi serveri tomonida ob'ektlar sifatida mavjud bo'lgan server kursorlari. Bundan tashqari, mijoz tomonida ma'lumotlar bazasi ilovalarini yaratish uchun foydalaniladigan mijoz tomoni kursorlari mavjud.

Adabiyotlarda qayd etilishicha, kursor yordamida ma’lumotlar to‘plamini satr bo‘yicha qayta ishlash aksariyat hollarda satrlar to‘plamini qayta ishlash uchun SQL vositalari tomonidan bajariladigan shunga o‘xshash harakatlarga qaraganda ancha sekinroqdir. Shuning uchun kursorlarni faqat qatorlar to'plami bilan operatsiyalar orqali kerakli harakatlar tavsifi samarasiz yoki hatto imkonsiz bo'lgan hollarda foydalanish tavsiya etiladi.

Kursor bilan ishlash odatda quyidagi bosqichlarni o'z ichiga oladi:

  • kursor deklaratsiyasi;
  • kursorni ochish;
  • kursorning birinchi yozuvidan boshlab atribut qiymatlarini o'zgaruvchilarga o'qish;
  • kursor ustida harakat qilish (odatda tsiklda) va kursor yozuvlarini qayta ishlash;
  • kursorni yopish;
  • kursorga ajratilgan xotirani bo'shatish.

Kursor DECLARE operatori yordamida e'lon qilinadi, uning formati quyida ko'rsatilgan. Shuni ta'kidlash kerakki, SQL Serverda ushbu bayonot ISO SQL standartining sintaksisini (standart versiyasi hujjatlarda ko'rsatilmagan) va Transact-SQL til kengaytmalarining CURSOR to'plamidan foydalangan holda sintaksisni qo'llab-quvvatlaydi.

Select_statement UCHUN

Kengaytirilgan Transact-SQL sintaksisi:

Kursor_nomini KURSOR E'lon qiling

Select_statement UCHUN

]][;]

GLOBAL kalit so'zini ko'rsatish e'lon qilinayotgan kursor serverga joriy ulanish doirasida bajariladigan har qanday ish to'plami, trigger yoki saqlangan protsedurada mavjudligini bildiradi. Kursor faqat ulanish buzilgan taqdirdagina bo'shatiladi.

Sukut bo'yicha yoki LOCAL aniq ko'rsatilganda yaratilgan "mahalliy" kursor faqat u yaratilgan ish to'plami, saqlangan protsedura yoki triggerda mavjud. To'plam, saqlangan protsedura yoki trigger bajarilishini tugatgandan so'ng, bunday kursor bilvosita ozod qilinadi. Kursor saqlanadigan protseduraning chiqish parametri (OUTPUT) orqali o'tkazilganda istisno hisoblanadi. Keyin kursor unga tegishli barcha o'zgaruvchilar chiqarilganda yoki "ko'lam" dan chiqarilganda chiqariladi.

FORWARD_ONLY siz kursor bo'ylab faqat oldinga "harakat qilishingiz" mumkin degan ma'noni anglatadi (faqat FETCH NEXT buyrug'i mavjud, pastga qarang), ya'ni. kursordagi har bir yozuvni ko'pi bilan bir marta qayta ishlash mumkin. FORWARD FAQAT STATIC, KEYSET yoki DYNAMIC kalit so'zlarisiz belgilansa, kursor DYNAMIC kursor kabi ishlaydi (pastga qarang). Agar FORWARD_ONLY yoki SCROLL parametrlaridan hech biri belgilanmagan bo'lsa va STATIC, KEYSET yoki DYNAMIC kalit so'zlardan hech biri belgilanmagan bo'lsa, FORWARD_ONLY opsiyasi sukut bo'yicha o'rnatiladi.

SCROLL kursor ustida istalgan yo‘nalishda “harakatlanishingiz” mumkinligini bildiradi (FETCH operatorida FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE mavjud). SCROLL opsiyasini FAST_FORWARD opsiyasi bilan belgilab bo‘lmaydi. STATIC, KEYSET va DYNAMIC kursorlari sukut bo‘yicha SCROLL ga o‘rnatiladi.

STATIC kursor yangilanmaganligini bildiradi. Bunday kursorning olingan ma'lumotlar to'plami ma'lumotlar bazasidan olinadi va tempdb vaqtinchalik ob'ektlari uchun ma'lumotlar bazasida saqlanadi. Kursor uchun asos bo'lib xizmat qiladigan jadvallarga kiritilgan o'zgartirishlar bundan keyin kursorda ko'rsatilmaydi.

KEYSET - kursorning ushbu turi uchun tanlangan yozuvlarni aniqlaydigan kalit qiymatlar to'plami vaqtinchalik jadvalda saqlanadi. Kursor ustida harakatlanayotganda, kalit bo'lmagan atributlarning qiymatlari tegishli jadvallardan olinadi, shuning uchun kursor bilan ishlashda kalit bo'lmagan ustunlardagi o'zgarishlar ko'rinadi. Agar kursordagi qator FETCH iborasi orqali olingan vaqtga qadar jadvaldan olib tashlangan bo'lsa, @@ FETCH_STATUS xizmat o'zgaruvchisi -2 qiymatini qaytaradi. Kursor ochilgandan so'ng jadvallarga qo'shilgan qatorlar kursorda ko'rinmaydi. Agar kursorni yaratuvchi so'rov noyob indeksga ega bo'lmagan kamida bitta jadvaldan foydalansa, KEYSET kursori STATIC ga aylantiriladi.

DYNAMIC - eng ko'p resurs talab qiladigan kursor turi bo'lib, natijalar to'plamidagi qatorlarga kiritilgan barcha ma'lumotlar o'zgarishlarini, shu jumladan yangi kiritilgan qatorlarni ko'rsatadi. Har bir namunadagi maʼlumotlar qiymatlari, tartibi va qatorlar aʼzoligi oʻzgarishi mumkin. FETCH ABSOLUTE dan dinamik kursorlar bilan foydalana olmaysiz.

FAST_FORWARD - eng tez kursor turi bo'lib, bir qatordan ikkinchisiga faqat "oldinga" o'tish imkonini beradi. Bu standart kursor turi (ixtiyoriy kalit so'zlar o'tkazib yuborilganda). Bu FORWARD_ONLY va READ_ONLY parametrlari bilan e'lon qilingan kursorga teng.

READ_ONLY - "faqat o'qish" kursorini belgilaydi: bunday kursor orqali ma'lumotlar bazasiga o'zgartirishlar kiritib bo'lmaydi.

SCROLL_LOCKS SQL Server satrlarni kursorga o'qiyotganda qulflab qo'yishini anglatadi, bu esa ularni ushbu turdagi kursor orqali yangilanishi yoki o'chirilishini ta'minlaydi.

OPTIMISTIC kalit so'zi bilan e'lon qilingan kursor qatorni blokirovka qilishni talab qilmaydi va ma'lumotlarni o'zgartirishga imkon beradi. Agar kursorda ma'lumotlar o'qilgandan so'ng asosiy jadvaldagi o'zgarishlar ro'y bersa, kursor orqali ushbu ma'lumotlarni o'zgartirishga urinish xatolikka olib keladi.

TYPE_WARNING, agar kursor so'ralgan turdan boshqasiga bilvosita aylantirilsa (masalan, jadvalda noyob indeks mavjud bo'lmaganda yuqorida tavsiflangan KEYSETdan STATIC kursorga o'zgartirish), mijozga ogohlantirish yuborilishini bildiradi.

Select_statement - bu kursorning natijalar to'plamini yaratuvchi SELECT iborasi.

FOR UPDATE bayonoti kursorda qaysi ustunlar yangilanishini belgilaydi. Agar OF ustun_nomi [, . . . n] boʻlsa, oʻzgartirishlar uchun faqat roʻyxatdagi ustunlar mavjud boʻladi. Agar ustunlar roʻyxati boʻlmasa, kursor READ_ONLY parametri bilan eʼlon qilingan hollar bundan mustasno, barcha ustunlar uchun yangilanish mumkin.

Kursorni ochish va to'ldirish uchun buyruqdan foydalaning

OPEN ((kursor_nomi) I @kursor_oʻzgaruvchisi)

Ochilganda kursor nomi (kursor_nomi) yoki CURSOR tipidagi o'zgaruvchi (@kursor_o'zgaruvchisi) orqali ko'rsatilishi mumkin. GLOBAL parametri kursor_nomi global kursor ekanligini bildiradi.

FETCH bayonoti kursor ma'lumotlar to'plami bo'ylab harakatlanish va ma'lumotlarni o'zgaruvchan qiymatlar sifatida olish uchun ishlatiladi:

OLISH[

(( kursor_nomi] Men @kursor_o'zgaruvchisi]

Kursor bo'ylab harakat yo'nalishini aniqlaydigan buyruqlar Jadvalda tasvirlangan. 10.10. Yuqorida aytib o'tilganidek, kursor turiga qarab, ma'lum bir kursor uchun ba'zi buyruqlar qo'llanilmasligi mumkin.

Shuni ta'kidlash kerakki, agar kursor endigina ochilgan bo'lsa, FETCH NEXT ning birinchi bajarilishi kursordagi birinchi yozuvga o'tadi.

10.10-jadval

Kursor ma'lumotlar to'plamida navigatsiya

@@FETCH_STATUS global o'zgaruvchisi FETCH bayonotining oxirgi bajarilishi natijasini bilish imkonini beradi:

O – harakat muvaffaqiyatli bajarildi;

  • -1 - bayonot bajarilmadi yoki satr natijalar to'plami chegarasidan tashqarida edi (kursor tugadi);
  • -2 - tanlanadigan qator yo'q, masalan, joriy yozuv "o'zgartirishga sezgir" turdagi kursor bilan ishlash paytida ma'lumotlar bazasidan o'chirilgan bo'lsa.

CLOSE bayonoti ochiq kursorni yopadi va ma'lumotlar to'plamini saqlash uchun ishlatiladigan xotirani bo'shatadi. Ma'lumotlarni tanlash va yopiq kursor ustida harakat qilish mumkin emas - buning uchun uni qayta ochish kerak.

YAPISH (( kursor_nomi)|@kursor_oʻzgaruvchisi)

DEALLOCATE bayonoti kursor va uning nomi yoki o'zgaruvchisi o'rtasidagi bog'lanishni olib tashlaydi. Agar bu kursorga havola qiluvchi familiya yoki o'zgaruvchi bo'lsa, kursorning o'zi o'chiriladi va u foydalanadigan barcha resurslar bo'shatiladi:

DEALLOCATE (( cursor_name] | @cursor_variable) Kursordan foydalanishning oddiy misolini ko'rib chiqaylik, bu erda 2000 yildan keyin nashr etilgan kitoblarning mualliflari va nomlari jadvaldan tanlanadi va ma'lumotlar SELECT iboralari orqali har safar bitta yozuv bilan o'tkaziladi. o'z sarlavhasi. koddagi izohlar bilan berilgan:

/*o‘zgaruvchilarni e’lon qilish*/

E'lon qiling @auth varchar(50), @title varchar(50)

QAYERDA >= 2000

/*kursorni oching va muallif va sarlavhani alohida SELECT iborasida koʻrsatib, “ishlatish”*/

KEYINGI kursordan @auth, @titlega olib keling

WHILESSFETCH_STATUS=0

KEYINGI kursordan @auth, Stitle INTO KETISH

/* kursorni yoping va qo'yib yuboring */

Kursorni DEALLOCATE

Yuqorida aytib o'tilganidek, kursor nomi o'rniga CURSOR tipidagi o'zgaruvchidan foydalanish mumkin. Quyida bunday o'zgaruvchilardan foydalanadigan o'xshash kod mavjud:

E'lon qilish Sauth varchar(50), Stitle varchar(50)

/*kursor tipidagi o‘zgaruvchini e’lon qilish*/

Scurl KURSORI E'lon qiling

Kursorni KURSORNI TEZ_ALGA E'lon qilish

Muallifni, sarlavhasini dbo.Bookl

QAYERDA >= 2000

/*kursor tipidagi o‘zgaruvchiga qiymat tayinlash*/

SET Scurl = kursor

WHILESSFETCH_STATUS=0

Scurl-dan Sauth, Stitle INTO KEYINGI OLISH