CHƯƠng 1: TỔng quan về sql server và csdl quan hệ i-giới thiệu sql server



tải về 457.4 Kb.
trang11/12
Chuyển đổi dữ liệu27.07.2016
Kích457.4 Kb.
#7139
1   ...   4   5   6   7   8   9   10   11   12

Chương VI: Chuyển Tác Và Bẫy Lỗi

I-Các Phát Biểu Chuyển Tác – Transactions:

-1Khái niệm :


Transactions dùng đảm bảo rằng các lệnh thay đổi dữ liệu được xử lý trọn vẹn. Nếu có một lệnh nào đó trong Transaction bị lỗi thì phải bãi bỏ các lệnh trong Transaction và phục hồi lại toàn bộ dữ liệu đã bị thay đổi bởi các lệnh trong Transaction trước đó.

Có 2 cách khai báo một Transaction : Khai báo rõ ràng hoặc khai báo ngầm định


-2Các Phát Biểu đóng gói một Transaction :

-aBắt đầu một chuyển tác:


Syntax : BEGIN TRAN[SACTION] [transaction_name]

Có thể không cần đặt tên Transaction. Tuy nhiên nên đặt tên Transaction để dễ đọc.

-bXác Nhận Kết Thúc Thành Công Một Chuyển Tác:


Syntax: COMMIT TRAN[SACTION] [transaction_name]

-cĐánh dấu vị trí trong chuyển tác:


Lưu vị trí chuyển tác

Syntax: SAVE TRAN[SACTION] _name>

-dKết thúc không thành công một chuyển tác:


Khi gặp lệnh này, tất cả những lệnh được thực hiện trong Transaction bắt đầu từ lệnh Begin Tran hoặc từ vị trí đánh dấu trong chuyển tác sẽ bị bãi bỏ

Syntax: ROLLBACK TRAN[SACTION] [transaction_name] | [save_name]

Ví dụ : Tạo SP thêm một sinh viên mới trong table SinhVien và thêm vào table SV_Detai MSDT mà sinh viên thực hiện.

Nếu MSDT không tồn tại chỉ bỏ thao tác chèn mẫu tin mới cho Table SV_DeTai.



CREATE PROCEDURE ThemSVDT

@MSDT Char(6), @MSSV char(6),

@TenSV VarChar(30), @Lop char(6),

@SoDT VarChar(10)= NULL, @DiaChi Char(10)=NULL

AS

BEGIN TRANSACTION VT1



INSERT SinhVien (MSSV,TenSV,SoDT, Lop, DiaChi)

VALUES (@MSSV, @TenSV, @SoDT, @Lop, @DiaChi)

IF @@ERROR <> 0

BEGIN


ROLLBACK TRAN VT1

RETURN 0


END

SAVE TRAN VT2

INSERT SV_DETAI(MSSV, MSDT)

VALUES (@MSSV, @MSDT )

IF (@@ERROR <> 0) ROLLBACK TRAN VT2

COMMIT TRANSACTION VT1

GO

-3Chuyển tác ngầm định: (Implicit Transactions)


Bất kỳ transaction nào mà bắt đầu, kết thúc hoặc roll back bằng lệnh BEGIN TRANSACTION, COMMIT TRANSACTION, or ROLLBACK TRANSACTION đều là Explicit Transaction. Bạn có thể thực hiện một Implicit Transaction bằng cách khai báo :

Syntax: SET IMPLICIT_TRANSACTIONS {ON | OFF}

Khi đặt chế độ Implicit Transaction là ON, Các phát biểu sau đây sẽ tự động bắt đầu một Transaction:

    • SELECT, INSERT, UPDATE, DELETE

    • ALTER TABLE

    • TRUNCATE TABLE

    • OPEN, FETCH

    • GRANT, REVOKE

Khi đặt ON, thì ở cuối các Tracsaction cần phải có lệnh Commit hoặc Roll Back. Nếu không thì các lệnh trong Transaction và tất cả dữ liệu đã thay đổi sẽ bị bỏ qua khi người dùng kết thúc kết nối.

Nếu cài đặt là OFF (default). Mỗi phát biểu tự động xác nhận nếu không bị lỗi.


II-Bẫy Lỗi – TRIGGERS

-1Khái niệm:


Trigger là dạng đặt biệt của SP, dùng khai báo ràng buộc dữ liệu cho một table, View và tự động thực hiện khi một trong 3 phát biểu Insert, Update, Delete thay đổi dữ liệu trên table đó. Trigger không được gọi trực tiếp như SP, không có tham số và giá trị trả về như SP.

Trigger chỉ được thực hiện khi phát biểu cập nhật đã thoả mãn các ràng buộc đã khai báo trên Table. Lợi ích chính của triggers là chúng có thể chứa các xử lý phức tạp trên các table có dữ liệu liên quan với table đang cập nhật.

Trigger có thể chứa phát biểu ROLLBACK TRAN ngay cả khi không có phát biểu BEGIN TRAN. Trong trường hợp phát biểu ROLLBACK TRANSACTION bên trong 1 Trigger được thực hiện:


    • Nếu trigger này được kích hoạt bởi 1 phát biểu cập nhật từ bên trong một transaction khác, thì toàn bộ Transaction đó bị bãi bỏ.

    • Nếu trigger được kích hoạt bởi 1 phát biểu cập nhật từ bên trong một gói, thì sẽ bãi bỏ toàn bộ gói.

Dựa vào ứng dụng của Trigger, có 3 loại Trigger như sau: Insert Trigger; Update Trigger; Delete Trigger

-2Tạo Trigger cho Table:


Cú pháp Tạo Trigger:

CREATE TRIGGER ON

[WITH ENCRYPTION]

AFTER | FOR DELETE, INSERT, UPDATE

AS


  • trigger_name : Tên Trigger phải phân biệt.

  • ON : tên table mà Trigger sẽ thực hiện. Không sử dụng Trigger cho View.

  • WITH ENCRYPTION : Mã hóa Trigger, không cho xem và sửa đổi câu lệnh tạo Trigger..

  • FOR DELETE, INSERT, UPDATE

Dùng chỉ định những phát biểu cập nhật nào nào trên Table sẽ kích hoạt Trigger.

Khi thực hiện Trigger, SQL sẽ tạo các bảng tạm: INSERTED và DELETED



  • Khi Insert mẫu tin mới vào Table thì mẫu tin mới đó cũng lưu trong table INSERTED

  • Khi Delete mẫu tin trong table: Thì các mẫu tin bị xoá đó được di chuyển sang table Deleted.

  • Khi Update mẫu tin trong table: thì table đó và table Inserted đều chứa mẫu tin có nội dung mới, còn Deleted chứa mẫu tin có nội dung cũ.

Bạn không thể thay đổi dữ liệu trên các table DELETED VÀ INSERTED. Nhưng bạn có thể dùng 2 table này để xử lý các mẫu tin trên các table liên quan. Ngoài ra, trong trigger Insert và Update, bạn có thể thay đổi nội dung của các mẫu tin mới bằng lệnh Update trên table có trigger.

  • AS : Từ khóa bắt đầu các hành động bên trong Trigger. Trigger có thể chứa hầu hết các lệnh của T-SQL ngoại trừ một số lệnh sau:

  • Các lệnh CREATE, ALTER, and DROP.

  • TRUNCATE TABLE

  • SELECT INTO (because it creates a table)

Chú ý:

  • Chủ của table và những thành viên có Role db_owner, db_ddladmin, và sysadmin có thể tạo và xoá triggers. Các permissions không thể sang nhượng. Hơn nữa, người tạo Trigger phải có quyền thực hiện tất cả phát biểu trên các tables.

  • Triggers không thể tạo view và table tạm (temporary tables), nhưng chúng có thể tham chiếu đến các views và temporary tables.

  • Các lệnh INSERT, UPDATE, hoặc DELETE có thể tác động trên nhiều dòng. Để biết được số dòng bị tác động, sử dụng hàm @@ROWCOUNT bên trong Trigger

-aSử dụng Trigger để ràng buộc toàn vẹn dữ liệu:


Ví dụ: Khi xóa hay thay đổi MSGV trong GIAOVIEN_HD, nếu giáo viên đó là chủ tịch hội đồng thì báo lỗi kết thúc.

Create Trigger trg_XoaHoiDongGV On HoiDong_GV

For Delete, Update

As

If Exists(Select 1 From HoiDong a, Deleted b



Where a.MSHD = b.MSHD And a.MSGVCTHD = b.MSGV)

Begin


Raiserror('Khong xoa hay thay doi giao vien CTHD',16,1)

RollBack Tran

End

Kiểm tra Trigger:

Delete From HoiDong_GV Where MsHD = 1 And MsGV = 1

Go

Update HoiDong_GV Set MSGV = 5 From HoiDong_GV a, HoiDong b



Where a.MSHD = b.MSHD And a.MSGV = b.MSGVCTHD And b.MSHD = 1

Go

-bSử dụng trigger để kiểm tra RB giá trị


Ví dụ: Kiểm tra RB : Một hội đồng không có quá 10 đề tài.

Create Trigger trg_ThemHDDT On Hoidong_DT

For Insert, Update

As

If (Select Count(a.mshd) From HoiDong_DT a, INSERTED b



Where a.mshd = b.mshd) > 10

Begin


RaisError (‘Khong the > 10’, 16, 1)

RollBack Tran

End

Go

Ví dụ: 2 Hội đồng trong cùng 1 ngày không thể trùng phòng



Create Trigger trg_HoiDong On HoiDong

For Insert, Update

As

If Exists(Select 1 From HoiDong a, Inserted b



Where a.MSHD = b.MSHD

And a.NgayHD = b.NgayHD And a.Phong = b.Phong)

Begin

Raiserror('Hai hoi dong cung 1 ngay khong trung phong',16,1)



RollBack Tran

End


Go

Update HoiDong Set NgayHD = '2001/10/30', Phong =2 Where MSHD = 4

Ví dụ: Một giáo viên không thể vừa là giáo viên phản biện vừa là giáo viên hướng dẫn đề tài.

Chú ý: Bạn có thể định nghĩa nhiều Trigger (khác tên nhau) cho cùng một hành động. Khi đó thứ tự thực hiện các trigger đó được xác định dựa trên thứ tự tạo ra chúng. Bạn có thể thay đổi thứ tự thực hiện mặc định này bằng SP: Sp_SetTriggerOrder



sp_SetTriggerOrder trg_UpdateAction2, First, ‘Update’

sp_SetTriggerOrder trg_UpdateAction1, Last, ‘Update’

SP này chỉ có thể chỉ định trigger nào được thực hiện đầu tiên và Trigger nào được thực hiện cuối cùng. Các Trigger còn lại sẽ thực hiện theo thứ tự tạo ra chúng.


-3Tạo Trigger cho View:


CREATE TRIGGER ON

[WITH ENCRYPTION]

INSTEAD OF DELETE | INSERT | UPDATE

AS

Trong các phiên bản trước phiên bản 2000, bạn không thể dùng các lệnh Insert, Update, Delete để cập nhật dữ liệu trên View.

Trong phiên bản 2000, bạn có thể cập nhật dữ liệu trên một bảng nguồn của View bằng tên của View. Trường hợp bạn muốn dùng 1 lệnh, cập nhật trên nhiều bảng nguồn của View thì phải tạo Trigger INSTEAD OF cho các View đó.

Không giống như AFTER triggers, Chỉ có thể INSTEAD OF cho mỗi lệnh hoặc INSERT, hoặc UPDATE, hoặc DELETE. Các Trigger INSTEAD OF sẽ thực hiện trước các AFTER triggers đã cài đặt cho các Table

Ví dụ: Tạo View liệt kê danh sách đề tài và sinh viên thực hiện đề tài đó



CREATE VIEW vwSVDeTai

AS

SELECT A.MSDT, A.TENDT, B.MSSV, NULLIF(C.TENSV, NULL) As TENSV



FROM DETAI A INNER JOIN SV_DETAI B ON A.MSDT = B.MSDT
INNER JOIN SINHVIEN C ON B.MSSV = C.MSSV

Để thêm đề tài mới trong table DeTai và sinh viên thực hiện đề tài đó trong table SV_DeTai, thay vì thực hiện 2 lệnh Insert trên từng Table, bạn có thể thực hiện 1 lệnh thông qua đối tượng View đã tạo.

INSERT vwSVDeTai(msdt, Tendt, mssv)

Values( 97014, 'Ma Hoa Du Lieu', '01th01')

Để làm được điều này, bạn phải tạo Trigger Instead Of Insert cho View

CREATE TRIGGER tgvwSVDeTai ON vwSVDeTai

INSTEAD OF INSERT

AS

If (Select Count(*) From Inserted) > 0



Begin

Insert detai(msdt, Tendt) Select A.msdt,A.tendt From Inserted A

Insert SV_detai(mssv,msdt) Select A.mssv,A.msdt From Inserted A

End


Chú ý: Việc sử dụng hàm NULLIF(C.TENSV, NULL) As TENSV để tránh trường hợp lỗi TenSV không được NULL vì lúc này TenSV là một Field tính toán.

-4Kiểm Tra Cột Được Cập Nhật :


Hàm Update() : Dùng kiểm tra có được cập nhật dữ liệu hay không.

Hàm Columns_Update(): Trả về các Byte cho biết những cột nào đã được cập nhật. Mỗi Bit trong các Byte này tương ứng với một cột trong Table theo thứ tự từ trái qua phải. Cột nào được cập nhật thì Bit tương ứng có giá trị 1. Sử dụng các toán tử Bitwise để kiểm tra cột nào được cập nhật.

^ (Bitwise Exclusive OR), & (Bitwise AND), | (Bitwise OR)

-5Disabling or Enabling a Trigger:


ALTER TABLE table ENABLE | DISABLE TRIGGER ALL | trigger_name[,…n]

-6Hiệu chỉnh Trigger:


Bạn có thể thay đổi các lệnh cần thực hiện cũng như hành động cập nhật mà Trigger sẽ được gọi thực hiện.

ALTER TRIGGER trigger_name

-7Xóa Trigger:


DROP TRIGGER {trigger} [,…n]

Nếu xóa một table thì tất cả Triggers của nó cũng bị xóa.

Quyền xóa :sysadmin, db_owner and db_ddladmin roles.



tải về 457.4 Kb.

Chia sẻ với bạn bè của bạn:
1   ...   4   5   6   7   8   9   10   11   12




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương