Title: Chuong 13: Transaction v
1Chuong 13 Transaction và Triggers
2M?c tiêu
- Qu?n lý transaction và khoá
- T?o và th? triggers d? qu?n lý vi?c ch?nh s?a d?
li?u
3Khái quát v? Transaction
- SQL Server s? d?ng nh?t ký giao d?ch (transaction
log) trong m?i database d? khôi ph?c l?i các giao
d?ch - Transaction là 1 chu?i các thao tác du?c th?c thi
nhu 1 don v? công vi?c riêng l? (single logical
unit of work).
4Khái quát v? Transaction
- Transaction ph?i bao hàm 4 thu?c tính co b?n
(ACID) sau - Atomicity m?t transaction ph?i là 1 don v? công
vi?c nguyên t? ho?c t?t c? các s?a d?i d? li?u
d?u du?c th?c thi ho?c không 1 s?a d?i nào du?c
th?c thi. - Consistency Khi hoàn t?t, transaction ph?i cho
d? li?u ? tình tr?ng ?n d?nh. - Isolation Nh?ng ch?nh s?a du?c làm b?i
transaction hi?n hành ph?i du?c cô l?p kh?i
nh?ng ch?nh s?a du?c làm b?i các transaction hi?n
hành khác. - Durability sau khi 1 transaction hoàn t?t, ?nh
hu?ng c?a nó s? c? d?nh lâu dài trong h? th?ng.
5Transaction
- Ð? hoàn thành các yêu c?u c?a 4 tính ch?t ACID
trên, SQL Server cung c?p các ch?c nang sau - Qu?n lý Transaction (Transaction management)
- Khoá (Locking)
- Ghi nh?t ký (Logging)
- Transaction log là nh?t ký du?c duy trì b?i
chính SQL Server d? qu?n lý t?t c? các
transaction - Explicit transaction là 1 transaction mà vi?c
kh?i d?ng và k?t thúc transaction dó d?u du?c
d?nh nghia m?t cách tu?ng minh
6Ð?nh nghia transaction
- BEGIN TRANSACTION transaction_name
- ? Dùng d? dánh d?u vi?c b?t d?u c?a 1 transaction
- COMMIT TRANSACTION transaction_name
- Hay
- COMMIT WORK
- ? Dùng d? dánh d?u vi?c k?t thúc c?a 1
transaction tu?ng minh
7Chuy?n giao t? d?ng các transaction Autocommit
Transactions
- Mode chuy?n giao t? d?ng (Autocommit mode) là
mode qu?n lý transaction m?c d?nh c?a SQL Server. - M?t l?nh (statement) du?c chuy?n giao (committed)
n?u nó th?c hi?n thành công hay s? tr? ngu?c v?
l?i ban d?u (roll back) n?u nó g?p l?i. - L?nh BEGIN TRANSACTION vu?t quy?n mode t? d?ng
chuy?n giao (autocommit) m?c d?nh. - SQL Server tr? v? l?i mode autocommit khi
transaction tu?ng minh dã du?c chuy?n giao
(commit) hay tr? ngu?c v? d?u (roll back), hay
khi mode transaction ng?m d?nh b? t?t.
8Ví d?
- BEGIN TRANSACTION trnUpdatePosition
- UPDATE Employee
- SET cCurrentPosition '0001'
- WHERE cEmployeeCode '000002'
- UPDATE Position
- SET iCurrentStrength iCurrentStrength 1
- WHERE cPositionCode '0001'
- COMMIT TRANSACTION trnUpdatePosition
9Làm th? nào d? quay v? l?i tru?c nh?ng thay d?i
- ROLLBACK TRANSACTION
- transaction_name savepoint_name
- Dùng d? quay ngu?c m?t transaction tu?ng minh hay
ng?m d?nh v? l?i di?m b?t d?u, hay v? di?m d?ng
(save-point) bên trong 1 transaction
10Ví d?
- BEGIN TRANSACTION
- USE Pubs
- UPDATE Titles
- SET Royalty Royalty 20
- WHERE type LIKE 'busin'
- IF (SELECT MAX(Royalty) FROM Titles WHERE Type
LIKE 'busin') gt25 - BEGIN
- ROLLBACK TRANSACTION
- PRINT 'Transaction Rolled back'
- END
- ELSE
- BEGIN
- COMMIT TRANSACTION
- PRINT 'Transaction Committed'
- END
11T?o di?m d?ng cho 1 TRANSACTION
- L?nh SAVE TRANSACTION dùng d? d?t 1 di?m d?ng
(save point) bên trong 1 transaction. Ði?m d?ng
chia transaction thành 1 các ph?n khác nhau sao
cho transaction có th? quay v? l?i di?m d?ng này
n?u 1 ph?n c?a transaction b? lo?i b? có di?u
ki?n. - Cú pháp
- SAVE TRANSACTION
- savepoint_name
12Th?c thi m?t transaction v?i di?m d?ng
- BEGIN TRANSACTION
- UPDATE Employee
- SET cCurrentPosition '0015'
- WHERE cEmployeeCode '000002'
- UPDATE Position
- SET iCurrentStrength iCurrentStrength 1
- WHERE cPositionCode '0015'
- SAVE TRANSACTION trnTransaction1
- UPDATE Requisition
- SET siNoOfVacancysiNoOfVacancy - 10
- WHERE cRequisitionCode'000004'
-
- UPDATE Position
- SET iCurrentStrengthiCurrentStrength10
- WHERE cPositionCode'0015
13Th?c thi m?t transaction v?i di?m d?ng
- IF (SELECT iBudgetedStrength-iCurrentStrength
- FROM Position WHERE cPositionCode '0015') lt0
- BEGIN
- PRINT 'Transaction 1 has been committed
- but transaction 2 has not been committed.'
- ROLLBACK TRANSACTION trnTransaction1
- END
- ELSE
- BEGIN
- PRINT 'Both the transactions have been
committed.' - COMMIT TRANSACTION
- END
14S? d?ng các transactions
- Vi?c nhóm 1 s? l?n các l?nh hay batch vào trong
cùng 1 transaction có th? c?n tr? vi?c th?c thi
h? th?ng. - N?u COMMIT và BEGIN không n?m trong cùng 1 batch,
khi l?i x?y ra, m?t s? batch s? v?n ti?p t?c th?c
thi. Ði?u này có th? làm cho d? li?u không nh?t
quán (inconsistency). - Các tài nguyên du?c dùng trong transaction s?
du?c gi?i phóng ch? khi transaction du?c hoàn
t?t.
15Các l?nh không h?p l?
- Rollback (quay v?) ph?i có kh? nang undo, vì
v?y các l?nh sau không du?c dùng - CREATE DATABASE, ALTER DATABASE
- CREATE TABLE, ALTER TABLE, TRUNCATE TABLE
- CREATE INDEX
- T?r c? l?nh DROP
- SELECT...INTO
- GRANT or REVOKE
- DISK INIT, RECONFIGURE, LOAD DATABASE, LOAD
TRANSACTION
16Ví d? v? s? d?ng khoá
- User1 dang th?c hi?n các l?nh sau d? c?p nh?t
di?m và ngày thi cho ?ng viên có mã là 000002
trong b?ng ExternalCandidate. - BEGIN TRANSACTION
- UPDATE ExternalCandidate
- SET siTestScore 90
- WHERE cCandidateCode'000002'
- UPDATE ExternalCandidate
- SET dTestDate getdate()
- WHERE cCandidateCode '000002'
17Ví d? v? s? d?ng khoá
- Trong khi transaction trên dang th?c hi?n, User2
mu?n l?p l?ch ph?ng v?n cho các ?ng viên, nhung
không th? xem chi ti?t c?a các ?ng viên có di?m
thi trên 80. User2 dang s? d?ng các l?nh sau - BEGIN TRANSACTION
- SELECT from ExternalCandidate
- WHERE siTestScore gt 80
- UPDATE ExternalCandidate
- SET dInterviewDate getdate() 2
- WHERE siTestScore gt 80
- Hãy xác d?nh t?i sao user2 không th? th?c thi
transaction
18Lock
- Các b?ng s? b? khoá khi transaction trên máy 1
dang th?c hi?n. - Khi transaction trên máy 1 k?t thúc b?ng cách
dùng l?nh sau - COMMIT TRANSACTION
- Thì transaction trên máy 2 m?i du?c th?c hi?n.
19Các bài toán d?ng th?i- Concurrency Problems
- N?u không dùng khoá và nhi?u user cùng truy xu?t
vào 1 database, các r?c r?i có th? x?y ra n?u các
transaction s? d?ng cùng lúc cùng m?t d? li?u.
Các bài toán d?ng th?i bao g?m - M?t c?p nh?t (Lost updates).
- Ph? thu?c chua du?c chuy?n giao (Uncommitted
dependency). - Phân tích không nh?t quán (Inconsistent
analysis). - Ð?c ?o (Phantom reads)
20Locking Co ch? khoá
- SQL Server s? d?ng co ch? khoá d? b?o d?m các
giao d?ch và tính nh?t quán c?a database. - Locking d? tránh cho ngu?i dùng kh?i d?c d? li?u
dang b? thay d?i b?i các ngu?i dùng khác, và
tránh cho nhi?u ngu?i dùng kh?i thay d?i d? li?u
cùng lúc. - M?c dù SQL Server th?c hi?n co ch? khoá t? d?ng,
ngu?i dùng v?n có th? thiêt k? các ?ng d?ng hi?u
qu? hon b?ng cách th?c hi?n các tùy bi?n v? khoá.
21Locking Co ch? khoá
- SQL Server có nhi?u m?c khóa khác nhau cho phép
các lo?i tài nguyên khác nhau du?c khoá b?i
transaction. - Ð? gi?m vi?c hao t?n khi th?c hi?n khóa, SQL
Server khoá tài nguyên m?t cách t? d?ng ? m?c phù
h?p v?i nhi?m v? c?n th?c hi?n. - Vi?c khoá ? m?c càng nh?, ví d? ? m?c các hàng
c?a b?ng, làm tang tính d?ng th?i, nhung có phí
t?n cao b?i vì nhi?u khoá du?c t?o ra n?u nhi?u
hàng du?c khoá. - Vi?c khoá ? m?c càng l?n, ch?ng h?n m?c b?ng, s?
gây ra lãng phí khi xét d?n tính d?ng th?i vì
vi?c khoá c? b?ng s? h?n ch? vi?c truy xu?t d?n
b?t k? ph?n nào c?a b?ng dó, nhung chi phí s?
gi?m b?i vì ch? có 1 ít khoá c?n du?c qu?n lý.
22Các lo?i khoá
- SQL Server có th? t?o ra các lo?i khoá sau
- RID (row identifier) khoá 1 hàng trong b?ng
- Key khoá 1 hàng trong b?ng index
- Table khoá t?t c? các hàng và ch? m?c c?a 1
b?ng - Database du?c dùng khi luu tr? c? database
- Page khoá 1 trang d? li?u hay trang ch? m?c
- Extent khoá 1 nhóm các trang trong lúc phân ph?i
không gian luu tr?
23Các ki?u Lock
- Shared Locks cho phép các transaction d?ng th?i
cùng d?c chung 1 tài nguyên - Update Locks tránh kh?i b? deadlock
- Exclusive Locks h?n ch? các transaction d?ng
th?i kh?i truy xu?t cùng m?t tài nguyên - Intent Locks SQL Server mu?n d?t du?c khoá lo?i
shared hay exclusive trên 1 s? tài nguyên m?c
th?p hon theo th? t? phân c?p - Schema Locks SQL Server xem xét các khoá làm
thay d?i chema khi b?t k? l?nh DDL (data
definition language) du?c th?c thi trong b?ng
24Deadlock
- A deadlock là m?t hoàn c?nh mà trong dó 2 user (
hay transaction) có các khoá trên các d?i tu?ng
khác nhau, và m?i user dang ch? khoá trên d?i
tu?ng c?a ngu?i dùng khác
25Phát hi?n và k?t thúc Deadlocks
- Vi?c phát hi?n deadlock du?c th?c thi b?i 1
thread riêng bi?t d? qu?n lý khoá. - Thread qu?n lý khoá (lock monitor thread) quét
qua các phiên làm vi?c dang d?i khoá. Trong lúc
quét l?n d?u, SQL Server dánh d?u cho t?t c? các
phiên làm vi?c dang d?i tài nguyên. Khi SQL
Server quét qua các phiên làm vi?c ? l?n th? hai,
vi?c dò tìm deadlock d? quy b?t d?u. N?u phát
hi?n ra có 1 chu?i các yêu c?u khoá, SQL Server
lo?i b? transaction nào mà ít t?n kém nh?t và
dánh d?u transaction dó nhu 1 n?n nhân c?a
deadlock (deadlock victim). - Nh? vào co ch? quét các session d? phát hi?n
deadlock, SQL Server k?t thúc deadlock nh? ch?n
m?t cách t? d?ng 1 user nào dó làm n?n nhân c?a
deadlock.
26Khái quát v? trigger
- SQL Server cung c?p hai co ch? co b?n d? b?o d?m
các quy t?c nghi?p v? (business rules) và b?o
toàn d? li?u ( data integrity) - Các ràng bu?c (Constraint)
- Triggers.
- Trigger là m?t lo?i th? t?c d?c bi?t ch?y t? d?ng
khi d? li?u trong 1 b?ng d?c bi?t nào dó b? ch?nh
s?a hay 1 s? ki?n d?c bi?t nào dó x?y ra.
27So sánh gi?a trigger và Constraint
- Trigger có th? th?c hi?n m?i ch?c nang c?a
constraint tuy nhiên không ph?i lúc nào dùng
trigger cung là cách t?t nh?t - Các trigger thu?ng dùng nh?t khi m?t s? quy t?c
nghi?p v? không th? th?c hi?n du?c b?i các
constraint. Xét ví d? sau - Constraint lo?i CHECK có th? du?c dùng d? xét
tính h?p l? c?a 1 c?t này hay c?t khác trong cùng
b?ng. Nhung n?u ?ng d?ng c?n xét tính h?p l? c?a
1 c?t trong b?ng v?i 1 c?t trong b?ng khác thì
không th? dùng constraint du?c mà ph?i dùng
trigger. - Các constraint có th? thông báo l?i thông qua h?
th?ng thông báo l?i tiêu chu?n. N?u ?ng d?ng yêu
c?u các thông báo tùy ch?n và qu?n lý l?i ph?c
t?p hon, ta c?n ph?i dùng trigger.
28Các tính ch?t c?a Trigger
- M?t trigger là m?t kh?i mã ch?a 1 t?p h?p các
l?nh T-SQL s? du?c kích ho?t d? dáp ?ng m?t hành
d?ng ( action) nào dó. - Các trigger có th? l?ng nhau lên d?n 32 m?c.
29Các tính ch?t c?a Trigger
- Nó du?c kích ho?t t? d?ng b?i SQL server khi
b?t k? m?t l?nh s?a d?i d? li?u du?c th?c hi?n - Nó giúp tránh nh?ng thay d?i d? li?u hông dúng,
không nh?t quán - Nó không th? g?i m?t cách tu?ng minh nhu 1 th?
t?c thông thu?ng (stored procedure) - Nó không th? tr? v? d? li?u cho ngu?i dùng
30T?o trigger
- Trigger th?c thi ph? thu?c vào hành d?ng mà
trigger du?c t?o. - Có 2 lo?i trigger
- FOR/AFTER s? kích ho?t sau khi l?nh INSERT,
UPDATE hay DELETE du?c th?c thi d?i v?i b?ng - INSTEAD OF s? du?c th?c thi thay cho l?nh làm
cho trigger ho?t d?ng - M?i trigger s? du?c k?t h?p v?i 1 b?ng hay view
31T?o trigger
- Cú pháp
- CREATE TRIGGER trigger_name
- ON table_name
- FOR INSERT DELETE UPDATE
- AS sql_statements
- Thông tin liên quan d?n trigger du?c vi?t vào các
b?ng h? th?ng sysobjects và syscomments
32Các b?ng Magic
- B?t k? lúc nào m?t trigger ho?t d?ng d? dáp ?ng
l?nh INSERT, DELETE, hay UPDATE, hai b?ng d?c
bi?t du?c t?o ra. Ðó là các b?ng magic, có tên là
inserted và deleted - B?ng inserted ch?a 1 b?n sao t?t c? các b?n ghi
du?c chèn vào b?ng trigger. - B?ng deleted ch?a 1 b?n sao t?t c? c1c b?n ghi
v?a du?c xoá kh?i b?ng trigger - B?t k? khi nào l?nh c?p nh?t du?c th?c hi?n,
trigger s? s? d?ng c? hai b?ng inserted và
deleted.
33B?ng Inserted and deleted
34T?o m?t trigger cho l?nh INSERT
- Trigger dùng cho l?nh INSERT s? du?c kích ho?t
b?t c? lúc nào có 1 b?n ghi m?i du?c chèn vào
b?ng trigger - Khi l?nh INSERT du?c th?c hi?n, m?t hàng m?i s?
du?c thêm vào c? hai b?ng b?ng trigger và b?ng
inseerted.
35Ví d? c?a insert trigger
- CREATE TRIGGER trgInsertRequisition
- ON Requisition FOR insert AS
- DECLARE _at_VacancyReported int
- DECLARE _at_ActualVacancy int
- SELECT _at_ActualVacancy
- iBudgetedStrength - iCurrentStrength
- FROM Position Join Inserted on
- Position.cPositionCode Inserted.cPositionCode
- SELECT _at_VacancyReported inserted.siNoOfVacancy
- FROM inserted
- IF(_at_VacancyReported gt _at_Actualvacancy)
- BEGIN
- PRINT 'The actual vacancies are less than the
vacancies - reported. Hence, cannot insert.'
- ROLLBACK TRANSACTION
- END
- RETURN
36Ví d? c?a insert trigger
- Ch?y th? trigger
- INSERT Requisition
- VALUES('000003','0001',getdate(), getdate() 7,
'0001', 'North',20)
37Trigger cho l?nh DELETE
- Trigger c?a l?nh DELETE s? du?c kích ho?t b?t k?
lúc nào có l?nh xoá các hàng kh?i b?ng trigger - Có 3 cách d? th?c thi vi?c b?o toàn tham chi?u
b?ng cách dùng trigger c?a l?nh DELETE - Phuong pháp xoá song song (Cascade)
- Phuong pháp h?n ch? (Restrict)
- Phuong pháp gán null (Nullify)
38Ví d? DELETE trigger
- CREATE TRIGGER trgDeleteContractRecruiter
- ON ContractRecruiter FOR delete
- AS
- PRINT 'Deletion of Contract Recruiters is not
allowed' - ROLLBACK TRANSACTION
- RETURN
39Trigger c?a l?nh UPDATE
- Trigger này d?oc kích ho?t b?t k? lúc nào có 1
s?a d?i nào dó trong b?ng trigger - Ví d?
- CREATE TRIGGER trgUpdateContractRecruiter
- ON ContractRecruiter FOR UPDATE
- AS
- DECLARE _at_AvgPercentageCharge int
- SELECT _at_AvgPercentageCharge avg(siPercentageChar
ge) - FROM ContractRecruiter
- IF(_at_AvgPercentageCharge gt 11)
- BEGIN
- PRINT 'The average cannot be more than 11'
- ROLLBACK TRANSACTION
- END
- RETURN
40(No Transcript)
41Hàm Update
- CREATE TRIGGER trgUpdatePub
- ON Publishers FOR UPDATE
- AS
- IF UPDATE (Pub_Id)
- BEGIN
- PRINT 'Publisher ID cannot be modified'
- ROLLBACK TRAN
- END
42Trigger và b?o toàn d? li?u
- Trigger có th? du?c dùng d? th?c hi?n các quy
t?c nghi?p v? và các quy lu?t b?o toàn d? li?u. - N?u có b?t k? thay d?i nào trong b?ng chính
(master table) thì trigger s? làm cho nh?ng thay
d?i dó cung x?y ra song song trong b?ng ph? thu?c
(dependent table) - Ví d? 1
- CREATE TRIGGER trgDeleteTitle
- ON Titles FOR DELETE
- AS
- DELETE TitleAuthor FROM TitleAuthor t JOIN
Deleted d - ON t.Title_Id d.Title_Id
- N?u b?t k? thay d?i nào vi ph?m quy lu?t b?o
toàn tham chi?u,thì trigger s? làm cho t?t c? các
thay d?i này b? t? ch?i, và lo?i tr? m?i c? g?ng
s?a d?i d? li?u trong database - Trigger cho phép th?c hi?n các ràng bu?c ph?c
t?p - Trigger có th? th?c hi?n 1 hành d?ng d?c bi?t
ph? thu?c vào các ch?nh s?a x?y ra trong b?ng
43Ví d? 2
- CREATE TRIGGER trgUpdateDelete
- ON TitleAuthor
- FOR INSERT, UPDATE
- AS
- / Ki?m tra s? t?n t?i c?a title ID trong b?ng
titles / - If (SELECT COUNT () FROM Titles t JOIN inserted
i - ON t.Title_Id i.Title_Id) 0
- BEGIN
- PRINT 'Invalid title ID entered.'
- ROLLBACK TRAN
- END
- / Ki?m tra s? t?n t?i c?a author ID trong b?ng
authors / - If (SELECT COUNT() FROM Authors t JOIN inserted
i - ON t.Au_Id i.Au_Id) 0
- BEGIN
- PRINT 'Invalid author ID entered.'
- ROLLBACK TRAN
- END
44S? d?ng nhi?u trigger
- Có th? t?o ra nhi?u trigger cho cùng 1 l?nh DML
trên cùng 1 b?ng - Vi?c s? d?ng nhi?u trigger s? giúp ngu?i dùng có
th? th?c thi nhi?u quy t?c nghi?p v?, m?i quy t?c
du?c th?c thi b?ng 1 trigger - Các trigger du?c th?c thi theo th? t? mà chúng
du?c t?o ra.
45Các trigger AFTER và INSTEAD OF
- Trigger AFTER có th? du?c t?o ra cho b?t k? b?ng
nào v?i các l?nh INSERT, UPDATE, hay DELETE tuong
t? nhu các trigger thông thu?ng khác. - Trigger AFTER s? kích ho?t sau khi l?nh DML liên
quan t?i nó du?c th?c thi - Trigger INSTEAD OF có th? du?c dùng d? th?c thi
m?t hành d?ng nhu l?nh DML trên 1 b?ng hay view
khác. Trigger này có th? du?c t?o ra cho c? b?ng
và view - Khác v?i trigger AFTER, không th? t?o nhi?u hon 1
trigger INSTEAD OF cho 1 l?nh DML trên cùng 1
b?ng hay view
46Các ví d?
- Ví d? 1
- CREATE TRIGGER trgDeleteTitles
- ON Titles AFTER DELETE
- AS
- print 'Deletion successful'
- Ví d? 2
- CREATE TRIGGER trgPublisherDelete
- ON Publishers INSTEAD OF DELETE
- AS
- print 'Master records cannot be deleted'
47Trigger và l?nh update view
- Hãy kh?o sát view sau
- CREATE VIEW vwEmployeeCandidate
- AS
- SELECT Employee.cCandidateCode, vFirstName,
vLastName, cPhone, siTestScore - FROM Employee JOIN InternalCandidate
- ON Employee.cCandidateCode InternalCandidate.cCa
ndidateCode - N?u mu?n c?p nh?t view b?ng l?nh sau thì s? nh?n
du?c thông báo l?i - UPDATE vwEmployeeCandidate
- SET cPhone '(614)324-1111', siTestScore 90
- WHERE cCandidateCode '000018'
- Lý do????
48Trigger và l?nh update view
- T?o trigger INSTEAD OF sau
- CREATE TRIGGER trgEmployeeCandidate
- ON vwEmployeeCandidate INSTEAD OF UPDATE
- AS
- DECLARE _at_Phone char(15)
- DECLARE _at_TestScore int
- DECLARE _at_CandidateCode char(6)
- SET _at_Phone (SELECT cPhone FROM INSERTED)
- SET _at_TestScore (SELECT siTestScore FROM
INSERTED) - SET _at_CandidateCode (SELECT cCandidateCode FROM
INSERTED) - UPDATE Employee
- SET cPhone_at_Phone
- WHERE cCandidateCode_at_CandidateCode
- UPDATE InternalCandidate
- SET siTestScore _at_TestScore
- WHERE cCandidateCode_at_CandidateCode
- ?L?nh update cho view trên s? du?c th?c thi mà
không có l?i nào
49Ch?nh s?a trigger
- ALTER TRIGGER owner.trigger_name
- ON owner.table_name
- FOR AFTER INSTEAD OF DELETE , INSERT
,UPDATE - AS
- IF UPDATE (column)
- AND OR UPDATE (column
- sql_statements
50M?t s? l?nh khác v? triggers
- Ð? c?m t?t c? trigger c?a 1 b?ng
- ALTER TABLE table_name DISABLE TRIGGER ALL
trigger_name - Ð? cho phép t?t c? các trigger c?a 1 b?ng
- ALTER TABLE table_name ENABLE TRIGGER ALL
trigger_name - Ð? xoá trigger
- DROP TRIGGER trigger_name