Skripts tabulas un skata izveidei:
Create Table dbo.TestTableŠ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.
(
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
Tālāk "Tā vietā" (skatīt rakstu DML trigeri teorijai) trigera izveide:
Create Trigger tr_vw_TestTable_Delete on dbo.vw_TestTableKā 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.
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
Šeit skripts eksperimentam:
Insert Into dbo.vw_TestTable(Skaitlis, TrisBurti)Rezultāts:
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
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