Triger 2

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 59

TH TC LU TR - HM TRIGGER

BIN CC B
Bin l mt i tng c th cha d liu
D liu c th a vo cc cu lnh SQL dng cc b
Tn cc bin cc b phi bt u bng @
T kha SET hay SELECT c dng gn gi tr cho
bin cc b.

BIN CC B (TT)
DECLARE @Tn_bin Kiu_d_liu [, ...]
Kiu d liu text, ntext hoc image khng c chp nhn
khi khai bo bin
V d: khai bo cc bin lu tr gi tr tng s lng
t hng, h tn nh cung cp, ngy xut hng. S dng
lnh DECLARE nh sau:

DECLARE @Tongsldat INT, @Hotenncc CHAR(50)


DECLARE @Ngayxh DATETIME

BIN CC B (TT) GN GI TR CHO BIN


T kha SET hay SELECT c dng gn gi tr cho
bin.
C php:
SET @<tn bin cc b> = <gi tr>
Hoc l:
SELECT @<Tn bin cc b> = <gi tr>
Ch : Phm vi hot ng ca bin ch nm trong mt
th tc hoc mt l c cha lnh khai bo bin

BIN CC B (TT) GN GI TR CHO BIN

V d:

tnh ra s lng t hng cao nht ca mt hng u DVD


Hitachi 1 a c m vt t l DD01. S dng lnh SELECT
nh sau:
DECLARE @MaxSldat INT
SELECT @MaxSldat=MAX(SLDAT)
FROM CTDONDH
WHERE MAVTU=DD01

BIN CC B (TT) XEM GI TR HIN HNH CA


BIN
PRINT @Tn_bin | Biu_thc_chui
tnh ng thi gi tr s lng t hng thp nht v
cao nht, hin th kt qu ra mn hnh. Ta s dng lnh
SELECT v PRINT :

DECLARE @MinSldat INT, @MaxSldat INT


SELECT@MinSldat=MIN(SLDAT),
@MaXSldat=MAX(SLDAT)
FROM CTDONDH
PRINT "S lng thp nht l : "
PRINT @MinSldat
PRINT "S lng cao nht l : " +
CONVERT(VARCHAR(10), @MaxSldat)
6

TH TC LU TR
Tp hp bin dch cc cu lnh T-SQL c lu tr vi mt
tn xc nh
S dng thc hin cc nhim v qun tr, hoc p dng
cc lut giao dch phc tp
C hai loi th tc lu tr:

Th tc lu tr h thng cp n phng php qun tr d


liu v cp nht thng tin vo cc bng (thng bt u bng
sp_).
Th tc lu tr do ngi dng nh ngha.

TH TC LU TR - LI CH

Tng tc thc hin:

Tc truy nhp d liu nhanh hn:

Thc thi ti server, bin dch mt ln


SQl khng phi la chn cch tt nht x l cc lnh SQL v
truy sut csdl mi khi chng c bin dch

Modular programming:

Mt th tc c th phn thnh cc th tc nh hn, cc th tc


ny c th c dng chung gia cc th tc khc->gim thi
gian thit k v thc thi cc th tc ng thi cng d qun l v
g ri.

S nht qun.
Ci thin s bo mt:

Nng cao an ton bo mt. C th ch ra quyn thc thi cho cc


th tc v vy n thc hin ng tc v ngi dng.
8

NH NGHA TH TC LU TR BNG
EM

NH NGHA TH TC LU TR BNG EM
(TT)
Tn th tc

Ni dung th tc
(thn th tc)

10

TO TH TC LU TR BNG T-SQL

To th tc lu tr trong csdl hin thi bng C php:


CREATE PROC[EDURE] <tn th tc>
[(<DSch tham s>) ]
[WITH
ECOMPILE| ENCRYPTION| RECOMPILE,
ENCRYPTION]
AS
[DECLARE <bin cc b>] <Cc cu lnh ca th tc>

Cc th tc lu tr c quyn truy cp ti tt c cc i
tng khi th tc c gi.
2100 tham s c th c s dng trong mt th tc lu tr.
Tham s bt u bi @, cn ch ra kiu dliu ca tham s
C th to lp nhiu bin cc b trong th tc
Dung lng ti a ca th tc lu tr l 128 MB.

11

TO TH TC LU TR BNG T-SQL (TT)

V d: Cho CSDL qun l im thi nh sau:

12

TO TH TC LU TR BNG T-SQL (TT)

Gi s ta cn thc hin mt chui cc thao tc trn c s


d liu
1. B sung thm mn hc c s d liu c m CST005 v s
n v hc trnh l 5 vo bng MONHOC
2. Ln danh sch nhp im thi mn c s d liu cho cc sinh
vin hc lp c m CDT002 (b sung thm vo bng DIEMTHI
cc bn ghi vi ct MAMONHOC nhn gi tr CST005, ct
MASV nhn gi tr ln lt l m cc sinh vin hc lp c m
CDT002 v cc ct im l NULL).

13

TO TH TC LU TR BNG T-SQL (TT)


Theo cch thng thng ta s vit 2 lnh nh sau:
INSERT INTO monhoc
VALUES(CST005, NC s d liu,5)

y l m
mn hc,
cho trc
nn ghi c
th ra lun

INSERT INTO diemthi(mamh,masv)


SELECT CST005, masv
FROM sinhvien
WHERE malop = CDT002

Lu : y bn c c php cu lnh chn d liu vo mt bng


c tn banga vi d liu ly t bng c tn bangb khc nh sau:
INSERT INTO banga (cot1, cot2)
SELECT cot1, cot2 FROM bangb
14

TO TH TC LU TR BNG T-SQL (TT)

Thay v phi vit 2 cu lnh nh trn, ta c th nh ngha


mt th tc vi cc tham s sau @mamh, @tenmh,
@sodvht, @malop nhp d liu cho mt mn hc bt k
v mt lp bt k do ngi dng nhp vo khi s dng th
tc.

15

TO TH TC LU TR BNG T-SQL (TT)


CREATE PROC sp_LenDanhSachDiem(
@mamh NVARCHAR(10),
@tenmh NVARCHAR(50),
@sodvht
SMALLINT,
@malop CHAR(4)
AS
BEGIN
INSERT INTO monhoc
VALUES(@mamh,@tenmh,@sodvht)

INSERT INTO diemthi(mamh,masv)


SELECT @mamh,masv
FROM sinhvien
WHERE malop=@malop
END
Khi th tc trn c to ra, thc hin c hai yu cu trn qua li
gi th tc:

sp_LenDanhSachDiem CST005','C s d liu',5,L002'

16

THC THI CC TH TC NGI DNG

Li gi th tc c dng:
<tn_th_tc> [<danh_sch_cc_i_s>]

S lng cc i s v th t ca chng phi ph hp vi s


lng v th t ca cc tham s hnh thc.
Nu li gi th tc c thc hin bn trong mt th tc khc,
bn trong mt trigger hay kt hp vi cc cu lnh SQL khc, ta
s dng c php nh sau:

EXEC[UTE] <tn_th_tc> [<danh_sch_cc_i_s>]


vd:
EXECUTE sp_LenDanhSachDiem CST005','C s d liu',5,L002'

Th t ca cc i s c truyn cho th tc c th khng cn


phi tun theo th t ca cc tham s nh khi nh ngha th tc
nu tt c cc i s c vit di dng:
@<tn_tham_s> = <gi_tr>

17

VD S DNG BIN TRONG TH TC:


CREATE
PROC
sp_Vidu(@malop1
CHAR(4),@malop2
CHAR(4))
AS
DECLARE @tenlop1 NVARCHAR(30)
DECLARE @namnhaphoc1 INT
DECLARE @tenlop2 NVARCHAR(30)
DECLARE @namnhaphoc2 INT
SELECT @tenlop1=tenlop,@namnhaphoc1=namnhaphoc
FROM lop WHERE malop=@malop1
SELECT @tenlop2=tenlop, @namnhaphoc2=namnhaphoc
FROM lop WHERE malop=@malop2
PRINT @tenlop1+' nhap hoc nam '+str(@namnhaphoc1)
print @tenlop2+' nhap hoc nam '+str(@namnhaphoc2)
IF @namnhaphoc1=@namnhaphoc2
PRINT 'Hai lp nhp hc cng nm'
ELSE
PRINT 'Hai lp nhp hc khc nm'

18

GI TR TR V CA THAM S TRONG TH
TC
Trng hp cn gi li gi tr ca i s sau khi kt thc th tc,
khai bo tham s ca th tc theo c php:
@tn_tham_s kiu_d_liu OUTPUT
Hoc:
@tn_tham_s kiu_d_liu OUT
Trong li gi th tc, sau i s c truyn cho th tc, cng
phi ch nh thm t kho OUTPUT (hoc OUT)
CREATE PROCEDURE sp_Conghaiso(
@a
INT,
@b
INT,
@c
INT OUTPUT)
AS
SELECT @c=@a+@b

19

GI TR TR V CA THAM S TRONG TH
TC (TT)

Thc hin li gi th tc trong mt tp cc cu lnh nh


sau:
DECLARE @tong INT
SELECT @tong=0
EXECUTE sp_Conghaiso 100,200,@tong OUTPUT
SELECT @tong

=> cu lnh SELECT @tong s cho kt qu l: 300

20

TH TC LU TR - THAM S GI TR MC
NH

Tham s vi gi tr mc nh c khai bo theo c php


nh sau:
@<tn_tham_s> <kdl> =

<gi_tr_mc_nh>

21

TH TC LU TR - THAM S GI TR MC
NH
CREATE PROC sp_TestDefault(
AS
BEGIN
@tenlop NVARCHAR(30)=NULL,
@noisinh NVARCHAR(100)='Hu')
IF @tenlop IS NULL
SELECT hodem,ten
FROM sinhvien INNER JOIN lop
ON sinhvien.malop=lop.malop
WHERE noisinh=@noisinh
ELSE
SELECT hodem,ten
FROM sinhvien INNER JOIN lop
ON sinhvien.malop=lop.malop
WHERE noisinh=@noisinh AND
tenlop=@tenlop
END

22

TH TC LU TR - THAM S GI TR MC NH
(TT)

Cho bit h tn ca cc sinh vin sinh ti Hu:

Cho bit h tn ca cc sinh vin lp Tin K24 sinh ti Hu:

sp_testdefault @tenlop='Tin K24

Cho bit h tn ca cc sinh vin sinh ti Ngh An:

sp_testdefault

sp_testDefault @noisinh=N'Ngh An

Cho bit h tn ca cc sinh vin lp Tin K26 sinh ti


Nng:

sp_testdefault @tenlop='Tin K26',@noisinh=' Nng'

23

TH TC LU TR - BIN DCH LI TH TC
Cc th tc lu tr c bin dch li phn nh s thay
i ti cc ch s
C ba cch bin dch li cc th tc:

S dng th tc h thng sp_recompile


Ch r WITH RECOMPILE vi lnh CREATE PROCEDURE
Ch r WITH RECOMPILE vi lnh EXECUTE

24

TH TC LU TR - THAY I TH TC LU TR
Cu lnh ALTER PROCEDURE c s dng sa mt
th tc lu tr
C php ging nh lnh CREATE PROCEDURE
S thay i ny vn gi li cc quyn ngi dng
Cp:

ALTER PROCEDURE tn_th_tc [(danh_sch_tham_s)]


[WITH
RECOMPILE|ENCRYPTION|
RECOMPILE,ENCRYPTION] AS
<Cc_cu_lnh_Ca_th_tc>

25

TH TC LU TR - XA TH TC

S dng cu lnh DROP PROCEDURE vi c php nh


sau:

DROP PROCEDURE <tn_th_tc >

26

TH TC LU TR - TNG KT
Mt th tc lu tr l mt nhm cc cu lnh SQL c
bin dch li.
Ngi pht trin CSDL hoc ngi qun tr h thng vit
th tc chy cc nhim v qun tr thng thng, hoc
ng dng cc lut giao dch phc tp. Th tc lu tr
cha cc thao tc hoc cc cu lnh truy vn d liu.
Cc th tc lu tr tng tc thc thi ca truy vn, h tr
truy cp d liu nhanh, h tr vic lp trnh theo m un,
duy tr tnh nht qun, v tng tnh bo mt.

27

TH TC LU TR - TNG KT (TT)

C ba cch bin dch li cc th tc lu tr:

S dng th tc h thng sp_recompile


Ch r WITH RECOMPILE vi lnh CREATE PROCEDURE
Ch r WITH RECOMPILE vi ln EXECUTE

Cu lnh ALTER PROCEDURE c s dng sa cha


mt th tc lu tr.

28

HM
Hm l i tng c s d liu tng t nh th tc.
im khc bit gia hm v th tc:

Hm tr v mt gi tr thng qua tn hm cn th tc th khng.

C th s dng hm nh l mt thnh phn ca mt biu


thc (chng hn, trong dsch chn ca lnh SELECT).
Hm do HQT CSDL cung cp sn
Ngi s dng c th nh ngha cc hm nhm phc v
cho mc ch ring ca mnh

29

HM

Hm gm 3 loi:
Cc hm thao tc tp hp
Hm thao tc bn ghi
Hm v hng

30

HM

Cc hm thao tc vi tp bn ghi c th c dng thay


cho tn cc bng trong SQL.

Cc hm tp hp tnh ton cho ra kt qu l mt gi tr


n nht (v d tnh tng hay trung bnh).

Cc hm v hng thao tc trn mt gi tr v tr v mt


gi tr. Cc hm ny c th c dng trong cc biu
thc.

31

HM NH NGHA HM

CREATE FUNCTION tn_hm ([danh_sch_tham_s])


RETURNS (kiu_tr_v_ca_hm)
AS
BEGIN
cc_cu_lnh_ca_hm
END

32

HM NH NGHA HM (TT)
CREATE FUNCTION thu(@ngay DATETIME)
NVARCHAR(10)
AS
BEGIN
DECLARE @st NVARCHAR(10)
SELECT @st=CASE DATEPART(DW,@ngay)
WHEN 1 THEN 'Chu nht'
WHEN 2 THEN 'Th hai'
WHEN 3 THEN 'Th ba'
WHEN 4 THEN 'Th t'
WHEN 5 THEN 'Th nm'
WHEN 6 THEN 'Th su'
ELSE 'Th by' END
RETURN (@st) /* Tr tr v ca hm */
END

RETURNS

33

HM S DNG HM

SELECT
masv,
hodem,
dbo.thu(ngaysinh), ngaysinh
FROM sinhvien
WHERE malop=C24102

ten,

34

HM HM VI GI TR TR V L D LIU KIU
BNG

CREATE
FUNCTION
([danh_sch_tham_s]) RETURNS TABLE
AS
RETURN (cu_lnh_select)

tn_hm

Qui tc:
Kiu tr v ca hm c ch nh bi mnh RETURNS
TABLE.
Trong phn thn ca hm ch c duy nht mt cu lnh RETURN
xc nh gi tr tr v ca hm thng qua duy nht mt cu lnh
SELECT (khng s dng bt k cu lnh no khc trong phn
thn ca hm).

35

HM HM VI GI TR TR V L D LIU KIU
BNG (TT)

Vd: nh ngha hm xemsv


CREATE FUNCTION func_XemSV(@khoa SMALLINT)
RETURNS TABLE
AS
RETURN(SELECT masv,hodem,ten,ngaysinh
FROM sinhvien INNER JOIN lop
ON sinhvien.malop=lop.malop
WHERE khoa=@khoa)

36

HM HM VI GI TR TR V L D LIU KIU
BNG (TT)

Khi cn s dng nhiu cu lnh trong phn thn hm, s


dng c php sau:

CREATE FUNCTION <tn_hm> ([<danh_sch_tham_s>])


RETURNS @<bin_bng> TABLE <nh_ngha_bng>
AS
BEGIN
<cc_cu_lnh_trong_thn_hm>
RETURN
END

37

HM HM VI GI TR TR V L D LIU KIU
BNG (TT)

Lu :
Cu trc bng tr v bi hm c xc nh da vo
nh ngha ca bng trong mnh RETURNS.
Bin @<bin_bng> trong mnh RETURNS c
phm vi s dng trong hm v c s dng nh mt
tn bng.
Cu lnh RETURN trong thn hm khng ch nh gi
tr tr v. Gi tr tr v ca hm chnh l cc dng d
liu trong bng c tn l @<binbng> c nh
ngha trong mnh RETURNS

38

HM HM VI GI TR TR V L D LIU KIU
BNG (TT) V D
CREATE FUNCTION
@bangthongke TABLE

Func_Tongsv(@khoa
(

makhoa

NVARCHAR(5),

tenkhoa

NVARCHAR(50),

tongsosv

INT

SMALLINT)

RETURNS

) AS
BEGIN
IF @khoa=0
INSERT INTO @bangthongke
SELECT khoa.makhoa,tenkhoa,COUNT(masv)
FROM (khoa INNER JOIN lop
ON khoa.makhoa=lop.makhoa) INNER JOIN sinhvien
ON lop.malop=sinhvien.malop
GROUP BY khoa.makhoa,tenkhoa

ELSE
39

HM HM VI GI TR TR V L D LIU KIU
BNG (TT)

INSERT INTO @bangthongke


SELECT khoa.makhoa,tenkhoa,COUNT(masv)
FROM (khoa INNER JOIN lop
ON khoa.makhoa=lop.makhoa)
INNER JOIN sinhvien
ON lop.malop=sinhvien.malop
WHERE khoa=@khoa
GROUP BY khoa.makhoa,tenkhoa
RETURN /*Tr kt qu v cho hm*/
END

40

HM HM VI GI TR TR V L D LIU KIU
BNG (TT)

Cu lnh:
SELECT * FROM dbo.func_TongSV(25)
S cho kt qu thng k tng s sinh vin kho 25 ca mi khoa:

Cn cu lnh:
SELECT * FROM dbo.func_TongSV(0)
Cho ta bit tng s sinh vin hin c (tt c cc kho) ca mi
khoa

41

TRIGGER TRIGGER L G?

Cu trc gn ging nh mt th tc ni ti nhng


Khng c tham s u vo v u ra
Phi c lin kt vi mt bng/ bng o trong CSDL

Khng th gi m c thc hin t ng. S dng trong


vic:
Tnh ton, cp nht gi tr t ng
Kim tra d liu nhp

Khai bo s dng
Kt hp vi cc hnh ng INSERT/UPDATE/DELETE trn
bng hay bng o
Khi to ra, tham gia vo transaction khi to bi cu lnh cp
nht d liu tng ng

42

CC X L BN TRONG TRIGGER

Kim tra cc rng buc d liu phc tp


Cc rng buc m t phc tp, khng th dng constraint
Gi hnh ng Rollback Tran hy thao tc cp nht khi vi
phm rng buc
Bo m d liu lun c ton vn
Bo m vic kim th ng dng khng lm h d liu c sn

Tnh ton, t ng cp nht gi tr


B sung cc hnh ng cp nht d liu m bo tnh ton
vn d liu
n gin ho vic xy dng ng dng

Ch nh cc by li d hiu
Tng tnh thn thin ca ng dng
D dng nhn ra cc li khi lp trnh

43

CC HN CH TRN TRIGGER
Khng c to v tham chiu bng tm
Khng to hay thay i, xo cu trc cc i tng sn c
trong CSDL

CREATE/ALTER/DROP

Khng gn, cp quyn cho ngi dng

GRAND/REVOKE

44

CC LOI TRIGGER

SQL Server 2000 c hai loi trigger

Trigger thng thng: AFTER (FOR) trigger


Chy sau cc hnh ng kim tra d liu ca cc Rule, Constraint
D liu b tm thi thay i trong bng

INSTEAD OF trigger
Chy trc cc hnh ng kim tra d liu
D liu cha h b thay i
C th thay th hnh ng cp nht d liu bng cc hnh ng khc

45

CC BNG TRUNG GIAN INSERTED V


DELETED

Inserted
Cha d liu c thm mi trong hnh ng
INSERT/UPDATE
C c hai loi trigger
Cu trc bng ging vi bng thc s c cp nht d liu

Deleted
Cha d liu b xo trong hnh ng DELETE/UPDATE
C c hai loi trigger
Cu trc bng ging vi bng thc s c cp nht d liu

Hnh ng update trong SQL Server


Xo dng d liu c
Thm vo dng d liu mi vi thng tin cp nht

46

LM VIC VI TRIGGER
47

TO MI TRIGGER
Trigger c th c to bng cng c Enterprise Manager,
hoc Query Analyzer.
Trong c hai trng hp, cu lnh CREATE TRIGGER
c s dng to ra trigger.

CREATE

TRIGGER Tn_Trigger ON Tn_bng

{ [ INSTEAD OF ] | [ FOR | AFTER ] }


{ [ INSERT [, UPDATE [,DELETE ] ] ] }
AS
[DECLARE

Bin_cc_b]

Cc_lnh

48

M T

Tn bng

INSTEAD OF: ch nh y l trigger loi instead of trigger

Mi bng ch c quyn to mt instead of trigger cho mt hnh


ng cp nht

FOR hoc AFTER

Tn bng m trigger to mi s lin kt

Nu to trigger thng thng

INSERT, UPDATE, DELETE

Hnh ng cp nht d liu tc ng vo bng kch hot


trigger.

49

XA TRIGGER

C php
DROP TRIGGER

Tn_trigger

50

SA NI DUNG TRIGGER

Sa ni dung
ALTER

TRIGGER Tn_Trigger ON Tn_bng

FOR INSERT [, UPDATE [,DELETE ]]


AS
[DECLARE

Bin_cc_b]

Cc_lnh

51

TRIGGER LNG NHAU

Trigger c th lng nhau


Hnh ng cp nht Trigger Cp nht bng khc
Trigger trn bng tng ng
Instead Of trigger khng pht sinh li trn chnh bng m n lin
kt

Cp nht Instead of Trigger Gi cu lnh cp nht xung bng


Instead of trigger

S cp lng ti a
32 cp
S dng bin @@NestedLevel

Cu hnh cho php trigger lng nhau

EXEC

sp_configure 'nested triggers', [0 | 1]

52

TRIGGER KIM TRA


RNG BUC D LIU
53

KHI THM MI MU TIN

Thng dng kim tra


Kha ngoi, Min gi tr, Lin thuc tnh trong cng mt bng
Lin thuc tnh ca nhiu bng khc nhau

3 loi u tin, ch dng trigger nu mun cung cp cc bo


li c th bng ting Vit

Nu khai bo cc rng buc ny bng constraint

Cc cu trc lnh thng dng khi kim tra


If Else
If Exists
Raiserror
Rollback Tran

54

KHI HY B MU TIN
Tng t, kim tra cc rng buc nh trigger INSERT
Nn kim tra rng buc kho ngoi

Thng thng rng buc ny dn n vic phi cp nht mt s


d liu trn bng khc
Ch : SQL Server 2000 c thuc tnh CASCADE DELETE

55

KHI SA I MU TIN

Tng t, kim tra cc rng buc nh trigger INSERT

Rng buc kho ngoi c th s dng CASCADE UPDATE


thc hin t ng

Xc nh ct ang c cp nht
If Update(Tn_ct)
X l

56

TRIGGER CP NHT GI TR T NG

Sau khi kim tra rng buc trigger c th


Rollback nu d liu khng hp l
Thc hin tip cc hnh ng cp nht trn bng khc m
bo ton vn d liu: Cp nht gi tr t ng
Vd: Insert CTGiaoHang Cp nht bng TONKHO

Cc hnh ng cp nht thng thc hin


Hy b d liu do quan h kho ngoi
Tnh li cc ct 'tnh ton' trong cc bng lin quan

V tr thc hin
Trong cng trigger kim tra rng buc nh ngha
Sau khi kim tra d liu hp l (tho mn cc rng buc)

57

INSTEAD OF TRIGGER

Bng o thng thng c th c cp nht nhng c nhiu


gii hn
Group By, Order By, Distinct
Rng buc kho ngoi
Thiu cc ct NOT NULL trong bng

Trigger Instead of
Xy ra trc khi SQL Server kim tra rng buc
Thay i hnh ng cp nht vo bng o bng hnh ng thch
hp trn bng gc

58

V D

To bng o sau
Select D.SoDH, NgayDH, MaNhaCC, V.MaVTu, TenVTu,
SoLuong, DonGia From CTDONDH CT, DONDH D, VATTU
V Where CT.SoDH = D.SoDH And CT.MaVTu = V.MaVTu
CREATE
TRIGGER
tg_vw_CTDONDH_BI
INSTEAD OF INSERT ON vw_CTDONDH
AS
-- Nu cha c n t hng, thm n t hng vo DONDH
Insert Into DONDH Select SoDH, NgayDH, MaNhaCC
From Inserted
Where SoDH Not In (Select SoDH
From DonDH)
-- Nu cha c vt t, thm vt t vo bng VATTU
Insert Into VATTU(MaVTu, TenVTu) Select MaVTu,
TenVTu From Inserted Where MaVTu Not In (Select
MaVTu From VATTU)
-- Thm cc chi tit t hng vo CTDONDH
Insert Into CTDONDH Select SoDH, MaVTu, SoLuong,
DonGia From Inserted
59

You might also like