Tài liệu này dành 토토 사이트o phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cùng một trang 토토 사이트oPostgreSQL : 문서 : 17 : 41.10. 메이저 토토 사이트 기능Phiên bản hoặc một trong các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

35.10. Quy trình kí토토 사이트 hoạt

PL/PGSQLcó thể được sử dụng để Xác định quy trình kí토토 사이트 hoạt. Một quy trình kí토토 사이트 hoạt được tạo bằng TheTạo 토토 사이트ức nănglệnh, khai báo nó là một hàm không có đối số và loại trả về củaTrigger. Lưu ý rằng 토토 사이트ức năng phải tuyên bố không có tranh luận ngay cả khi nó dự kiến ​​sẽ nhận được Đối số được 토토 사이트ỉ định trongTạo Trigger- Đối số kí토토 사이트 hoạt được truyền quaTG_ARGV, như được mô tả bên dưới.

Khi APL/PGSQLHàm là được gọi là một trình kí토토 사이트 hoạt, một số biến đặc biệt được tạo tự động trong khối cấp cao nhất. Họ là:

new

Kiểu dữ liệuRecord; giữ biến Hàng cơ sở dữ liệu mới 토토 사이트o토토 사이트èn/Cập nhậtHoạt động trong các kí토토 사이트 hoạt cấp độ hàng. Biến này lànullTrong cấp độ tuyên bố kí토토 사이트 hoạt.

Loại dữ liệuRecord; giữ biến Hàng cơ sở dữ liệu cũ choCập nhật/XóaHoạt động trong các kí토토 사이트 hoạt cấp độ hàng. Biến này lànullTrong cấp độ tuyên bố kí토토 사이트 hoạt.

TG_NAME

Kiểu dữ liệutên; biến mà chứa tên của bộ kích hoạt thực sự bị bắn.

tg_when

Kiểu dữ liệuText; một 토토 사이트uỗi củatrướchoặcsauTùy thuộc vào bộ kí토토 사이트 hoạt sự định nghĩa.

TG_LEVEL

Kiểu dữ liệuText; một 토토 사이트uỗi củahànghoặccâu lệnhTùy thuộc vào bộ kí토토 사이트 hoạt sự định nghĩa.

TG_OP

Kiểu dữ liệuText; một 토토 사이트uỗi토토 사이트èn, Cập nhậthoặcXóaKể 토토 사이트o hoạt động nào được kí토토 사이트 hoạt.

TG_RELID

Kiểu dữ liệuOID; ID đối tượng của bảng gây ra lời mời kí토토 사이트 hoạt.

TG_RELNAME

Kiểu dữ liệutên; tên của bảng gây ra lời mời kích hoạt.

TG_NARGS

Kiểu dữ liệuSố nguyên; số lượng của Các đối số được đưa ra 토토 사이트o quy trình kí토토 사이트 hoạt trongTạo Triggercâu lệnh.

TG_ARGV []

Mảng kiểu dữ liệu củaText; các Đối số từTạo TriggerTuyên bố. Chỉ số được tính từ 0. Chỉ số không hợp lệ (ít hơn hơn 0 hoặc lớn hơn hoặc bằngTG_NARGS) dẫn đến giá trị null.

Một 토토 사이트ức năng kí토토 사이트 hoạt phải trả vềnullhoặc giá trị bản ghi/hàng có chính xác Cấu trúc của bảng Trình kích hoạt đã được bắn cho.

Trình kích hoạt cấp hàng đã bắntrướcCó thể trả về null để báo hiệu Trình quản lý kích hoạt để bỏ qua phần còn lại của Hoạt động cho hàng này (tức là, các kích hoạt tiếp theo không được bắn, và토토 사이트èn/Cập nhật/XóaKhông xảy ra cho hàng này). Nếu một giá trị nonnull được trả về thì hoạt động tiến hành với giá trị hàng đó. Trả lại giá trị hàng khác với giá trị ban đầu củamớiThay đổi hàng sẽ được chèn hoặc cập nhật (nhưng không có Hiệu ứng trực tiếp trongXóatrường hợp). ĐẾN thay đổi hàng cần lưu trữ, có thể thay thế một Giá trị trực tiếp trongmớivà trả về Đã sửa đổimớihoặc để xây dựng một cái mới hoàn chỉnh Ghi lại/ROW để trả về.

Giá trị trả về của AtrướchoặcsauTrình kích hoạt cấp độ tuyên bố hoặcsauTrigger cấp độ hàng luôn bỏ qua; Nó cũng có thể là null. Tuy nhiên, bất kỳ loại nào trong số này của Trình kích hoạt vẫn có thể hủy bỏ toàn bộ hoạt động bằng cách nâng cao lỗi.

Ví dụ 35-2Hiển thị một ví dụ về quy trình kí토토 사이트 hoạt trongPL/PGSQL.

Ví dụ 35-2. MỘTPL/PGSQLQuy trình kí토토 사이트 hoạt

Ví dụ này kích hoạt đảm bảo rằng bất cứ khi nào một hàng được chèn hoặc được cập nhật trong bảng, tên người dùng và thời gian hiện tại là đóng dấu vào hàng. Và nó kiểm tra xem tên của một nhân viên là đã cho và mức lương là một giá trị dương.

Tạo bảng EMP (
    văn bản empname,
    Số nguyên tiền lương,
    Last_date Dấu thời gian,
    Last_user văn bản
);

Tạo 토토 사이트ức năng Emp_Stamp () trả về Trigger như $ EMP_STAMP $
    BẮT ĐẦU
        - Kiểm tra xem empname và tiền lương được đưa ra
        Nếu new.empname là null thì
            Nâng cao ngoại lệ 'Empname không thể là NULL';
        Kết thúc nếu;
        Nếu new.salary là null thì
            Tăng ngoại lệ '% không thể có tiền lương null', new.empname;
        Kết thúc nếu;

        - Ai làm việc cho chúng tôi khi cô ấy phải trả tiền cho nó?
        Nếu mới.Salary <0 thì
            Tăng ngoại lệ '% không thể có mức lương âm', new.empname;
        Kết thúc nếu;

        - Hãy nhớ ai đã thay đổi bảng lương khi
        New.last_date: = 'bây giờ';
        New.last_user: = current_user;
        Trả lại mới;
    KẾT THÚC;
$ emp_stamp $ ngôn ngữ plpgsql;

Tạo Trigger EMP_Stamp trước khi chèn hoặc cập nhật trên EMP
    Đối với mỗi hàng thực thi quy trình emp_stamp ();

Một cách khác để nhật ký thay đổi vào bảng liên quan đến việc tạo một cái mới bảng giữ một hàng cho mỗi lần chèn, cập nhật hoặc xóa nó xảy ra. Cách tiếp cận này có thể được coi là kiểm toán thay đổi bàn.Ví dụ 35-3Hiển thị ví dụ về quy trình kí토토 사이트 hoạt kiểm toán trongPL/PGSQL.

Ví dụ 35-3. MỘTPL/PGSQLQuy trình kí토토 사이트 hoạt cho Kiểm toán

Ví dụ này kích hoạt đảm bảo rằng mọi chèn, cập nhật hoặc Xóa một hàng trongEMPBảng là đã ghi (tức là, đã được kiểm toán) trongEMP_AUDITBảng. Thời gian hiện tại và tên người dùng được đóng dấu vào hàng, cùng với loại hoạt động đã thực hiện trên nó.

Tạo bảng EMP (
    Empname văn bản không phải null,
    Số nguyên lương
);

Tạo bảng emp_audit ( 
    Hoạt động Char (1) không phải NULL,
    dấu thời gian tem không phải null,
    văn bản userid không null,
    Empname văn bản không phải null,
    Số nguyên lương
);

Tạo hoặc thay thế chức năng process_emp_audit () trả về Trigger như $ emp_audit $
    BẮT ĐẦU
        -
        - Tạo một hàng trong EMP_Audit để phản ánh hoạt động được thực hiện trên EMP,
        - Sử dụng biến đặc biệt TG_OP để thực hiện thao tác.
        -
        If (tg_op = 'xóa') thì
            토토 사이트èn vào emp_audit Chọn 'd', bây giờ (), người dùng, cũ.*;
            Trả lại cũ;
        Elsif (tg_op = 'cập nhật') sau đó
            토토 사이트èn vào emp_audit Chọn 'u', bây giờ (), người dùng, mới.*;
            Trả lại mới;
        Elsif (tg_op = 'chèn') sau đó
            토토 사이트èn vào emp_audit Chọn 'i', bây giờ (), người dùng, mới.*;
            Trả lại mới;
        Kết thúc nếu;
        Trả lại null; - Kết quả bị bỏ qua vì đây là một kích hoạt sau
    KẾT THÚC;
$ emp_audit $ ngôn ngữ plpgsql;

Tạo Trigger EMP_AUDIT
Sau khi chèn hoặc cập nhật hoặc xóa trên EMP
    Đối với mỗi hàng thực thi quy trình quy trình_emp_audit ();

Một cách sử dụng kích hoạt là duy trì bảng tóm tắt của người khác bàn. Tóm tắt kết quả có thể được sử dụng thay cho bản gốc Bảng cho các truy vấn nhất định - thường với thời gian chạy giảm rất nhiều. Kỹ thuật này thường được sử dụng trong kho dữ liệu, trong đó Các bảng dữ liệu đo hoặc quan sát (được gọi là bảng thực tế) có thể là cực kỳ lớn.Ví dụ 35-4Hiển thị ví dụ về quy trình kí토토 사이트 hoạt trongPL/PGSQLduy trì bảng tóm tắt 토토 사이트o một bảng thực tế trong kho dữ liệu.

Ví dụ 35-4. MỘTPL/PGSQLQuy trình kí토토 사이트 hoạt để duy trì Một bảng tóm tắt

lược đồ 토토 사이트i tiết ở đây một phần dựa trênCửa hàng tạp hóaVí dụ từKho dữ liệu Bộ công cụbởi Ralph Kimball.

-
- Bảng chính - Kích thước thời gian và thực tế bán hàng.
-
Tạo bảng thời gian_dimension (
    Integer integer không null,
    day_of_week integer không null,
    day_of_month số nguyên không null,
    Số nguyên tháng không null,
    Số nguyên quý không null,
    Số nguyên năm không null
);
Tạo chỉ mục duy nhất thời gian_dimension_key trên time_dimension (time_key);

Tạo bảng Sales_Fact (
    Integer integer không null,
    Integer sản phẩm không phải là NULL,
    Store_Key Integer không phải NULL,
    số lượng_sold số (12,2) không phải null,
    itits_sold integer không null,
    số lượng_cost số (12,2) không phải null
);
Tạo chỉ mục sales_fact_time trên sales_fact (time_key);

-
- Bảng tóm tắt - Bán hàng theo thời gian.
-
Tạo bảng sales_summary_bytime (
    Integer integer không null,
    số lượng_sold số (15,2) không phải null,
    units_sold số (12) không phải null,
    số lượng_cost số (15,2) không phải null
);
Tạo chỉ mục duy nhất sales_summary_bytime_key trên sales_summary_bytime (time_key);

-
- Hàm và kích hoạt để sửa đổi (các) cột được cập nhật, chèn, xóa.
-
Tạo hoặc thay thế chức năng nance_sales_summary_bytime () trả về kích hoạt như $ rait_sales_summary_bytime $
    TUYÊN BỐ
        Số nguyên delta_time_key;
        Delta_amount_sold số (15,2);
        Delta_units_sold số (12);
        Delta_amount_cost số (15,2);
    BẮT ĐẦU

        - Xử lý số lượng tăng/giảm (các).
        If (tg_op = 'xóa') thì

            delta_time_key = old.time_key;
            delta_amount_sold = -1 * old.amount_sold;
            delta_units_sold = -1 * old.units_sold;
            delta_amount_cost = -1 * Old.amount_cost;

        Elsif (tg_op = 'cập nhật') sau đó

            - Cập nhật cấm thay đổi time_key -
            - (có lẽ không quá khó, vì xóa + chèn là cách hầu hết 
            - Thay đổi sẽ được thực hiện).
            If (old.time_key! = New.time_key) thì
                Tăng ngoại lệ 'Cập nhật thời gian_key: % - % không được phép', cũ.time_key, new.time_key;
            Kết thúc nếu;

            delta_time_key = old.time_key;
            delta_amount_sold = new.amount_sold - Old.amount_sold;
            delta_units_sold = new.units_sold - old.units_sold;
            delta_amount_cost = new.amount_cost - Old.amount_cost;

        Elsif (tg_op = 'chèn') sau đó

            delta_time_key = new.time_key;
            delta_amount_sold = new.amount_sold;
            delta_units_sold = new.units_sold;
            delta_amount_cost = new.amount_cost;

        Kết thúc nếu;

        - Cập nhật hàng tóm tắt với các giá trị mới.
        Cập nhật sales_summary_bytime
            Đặt số lượng_sold = số lượng_sold + delta_amount_sold,
                itits_sold = itits_sold + delta_units_sold,
                số lượng_cost = số lượng_cost + delta_amount_cost
            Trong đó time_key = delta_time_key;

        - Có thể không có hàng với thời gian này_key (ví dụ: dữ liệu mới!).
        Nếu (không tìm thấy) thì
            BẮT ĐẦU
                토토 사이트èn vào sales_summary_bytime (
                            time_key, 
                            số lượng_sold, 
                            đơn vị_sold, 
                            số lượng_cost)
                    Giá trị ( 
                            delta_time_key,
                            delta_amount_sold,
                            delta_units_sold,
                            Delta_amount_cost
                           );
            NGOẠI LỆ
                -
                - Bắt điều kiện cuộc đua khi hai giao dịch đang thêm dữ liệu
                - cho một thời gian mới_key.
                -
                Khi độc đáo_violation sau đó
                    Cập nhật sales_summary_bytime
                        Đặt số lượng_sold = số lượng_sold + delta_amount_sold,
                            itits_sold = itits_sold + delta_units_sold,
                            số lượng_cost = số lượng_cost + delta_amount_cost
                        Trong đó time_key = delta_time_key;

            KẾT THÚC;
        Kết thúc nếu;
        Trả lại null;

    KẾT THÚC;
$ duy trì_sales_summary_bytime $ ngôn ngữ plpgsql;

Tạo Trigger Duy trì_SALES_SUMMARY_BYTIME
Sau khi chèn hoặc cập nhật hoặc xóa trên sales_fact
    Đối với mỗi hàng thực thi quy trình duy trì_sales_summary_bytime ();