ceturtdiena, 2011. gada 3. marts

Piemērs: Instead Of DML trigeris skatam

Rakstā ar piemēru parādīts "Tā vietā" (Instead Of) trigeris uz skata. Ideja tāda, ka skats attēlo visus tabulas ierakstus, kam nav norādīta pazīme "Dzēsts". Dzēšot ierakstu no skata, tie tiek nevis izdzēsti, bet atzīmēti kā dzēsti.

Skripts tabulas un skata izveidei:
Create Table dbo.TestTable
(
   TestTableID int Identity primary key,
   Skaitlis int,
   TrisBurti char(3),
   MainigsGarums NVarChar(20),
   GarsTeksts NVarChar(100),
   Deleted bit Default 0
)
Go
Create View dbo.vw_TestTable
-- 2011-03-01 Komentārs par skatu
As
    Select TestTableID, Skaitlis, TrisBurti,
        MainigsGarums, GarsTeksts
    From dbo.TestTable
    Where Deleted = 0
Šajā gadījumā izdevīgi būtu lietotājiem nodrošināt tiesības uz skatu, nevis uz tabulu. Līdz ar to ar trigera un skata palīdzību panākot, ka ieraksti tiek nevis dzēsti, bet vienkārši atzīmēti kā dzēsti.
Tālāk "Tā vietā" (skatīt rakstu DML trigeri teorijai) trigera izveide:
Create Trigger tr_vw_TestTable_Delete on dbo.vw_TestTable
Instead Of Delete
As
    Set NoCount On
    Update tt
        Set Deleted = 1
    From dbo.TestTable tt
        Inner Join Deleted d on tt.TestTableID = d.TestTableID
Kā redzams- trigeris tiek veidots uz skata. Izpildot delete komandu uz skata, datu tabulas rinda tiks nevis dzēsta, bet gan atzīmēta kā dzēsta. Tā kā skatā ir "Where" daļa, ieraksti ar dzēšanas pazīmi netiks attēloti.
Šeit skripts eksperimentam:
Insert Into dbo.vw_TestTable(Skaitlis, TrisBurti)
    Values(99, 'ABC')
Insert Into dbo.vw_TestTable(Skaitlis, TrisBurti)
    Values(100, 'BCD')
Insert Into dbo.vw_TestTable(Skaitlis, TrisBurti)
    Values(100, 'CDE')
Delete From dbo.vw_TestTable Where Skaitlis = 100
Rezultāts:
Vēl dažas piezīmes:
* Šajā gadījumā trigeris tika veidots uz skata, bet tikpat labi to varēja veidot uz tabulas. Veidojot trigeri uz skata, pozitīvā lieta ir tā, ka no tabulas ierakstus joprojām var tik dzēsti nebloķējot trigeri. Savukārt veidojot trigeri uz tabulas, to nevar apiet. Šādi ir plašākas iespējas variēt ar lietotāju tiesībām.
* Ja ir nepieciešams visus datus uzglabāt (arī dzēstos ierakstus), labāka doma būtu tos pārvietot uz citu tabulu, tādā veidā pēc iespējas mazāk iespaidojot ātrdarbību. Nu vai padomāt par tabulas dalīšanas risinājumiem- Tabulu horizontālā dalīšana (Partitioned Tables)

Pēc sevis satīram:
Drop View dbo.vw_TestTable
Drop Table dbo.TestTable

Nav komentāru:

Ierakstīt komentāru