Chương 9. Hàm và toán tử
9.23. Hàm thông tin hệ thống
Bảng 9-47 chỉ ra vài hàm trích thông tin phiên làm việc và hệ thống. Bổ sung thêm vào các hàm được liệt kê trong phần này, có một số hàm có liên quan tới hệ thống thống kê cũng cung cấp thông tin hệ thống. Xem Phần 27.2.2 để có thêm thông tin.
Bảng 9-47. Các hàm thông tin phiên
Hàm Dạng trả về Mô tả
current_catalog name tên của cơ sở dữ liệu hiện hành (gọi là “catalog” theo tiêu chuẩn SQL) current_database() name tên của cơ sở dữ liệu hiện hành
current_schema[()] name tên của cơ sở dữ liệu hiện hành
current_schemas(boolean) name[] tên các sơ đồ trong đường tìm kiếm, tùy ý đưa vào các sơ đồ ngầm định current_user name tên của người sử dụng theo ngữ cảnh thực thi hiện hành
current_query() text văn bản truy vấn thực thi hiện hành, như được máy trạm đệ trình (có thể chứa nhiều hơn một lệnh)
pg_backend_pid() int ID qui trình của tiến trình máy chủ được gắn cho phiên hiện hành pg_listening_channels() setof text tên các kênh mà phiên đang nghe hiện hành
inet_client_addr() inet địa chỉ của kết nối từ xa inet_client_port() int cổng của kết nối từ xa inet_server_addr() inet địa chỉ của kết nối cục bộ inet_server_port() int cổng của kết nối cục bộ
pg_my_temp_schema() oid OID của sơ đồ tạm thời của phiên, hoặc 0 nếu không có pg_is_other_temp_schem
a(oid) boolean là sơ đồ của sơ đồ tạm thời của phiên khác?
pg_postmaster_start_time ()
timestamp with time zone
thời gian khởi động máy chủ pg_conf_load_time() timestamp with
time zone thời gian tải cấu hình session_user name tên người sử dụng phiên
user name tương đương với current_user
version() text thông tin phiên bản của PostgreSQL
Lưu ý: current_catalog, current_schema, current_user, session_user và user có tình trạng cú pháp đặc
biệt trong SQL: chúng phải được gọi mà không có các dấu ngoặc đơn đi sau. (Trong PostgreSQL, các dấu ngoặc đơn có thể tùy ý được sử dụng với current_schema, nhưng không với các thứ khác).
session_user là thông thường mà người sử dụng đã khởi tạo kết nối cơ sở dữ liệu hiện hành; nhưng các siêu người sử dụng (superusers) có thể thay đổi thiết lập này với SET SESSION AUTHORIZATION. current_user là mã định danh người sử dụng mà có thể áp dụng được cho việc kiểm tra quyền. Thường thì nó là ngang bằng với người sử dụng phiên, nhưng nó có thể bị thay đổi với SET ROLE. Nó cũng thay đổi trong quá trình thực thi các hàm với thuộc tính SECURITY DEFINER. Trong cách nói của Unix, người sử dụng phiên là “người sử dụng thực sự” và người sử dụng hiện hành là “người sử dụng có hiệu quả”.
current_schema trả về tên của sơ đồ mà là đầu tiên trong đường tìm kiếm (hoặc một giá trị null nếu đường tìm kiếm là rỗng). Đây là sơ đồ mà sẽ được sử dụng cho bất kỳ bảng nào hoặc các đối tượng có tên khác được tạo ra mà không có việc chỉ định một sơ đồ đích. current_schemas(boolean) trả về một mảng các tên của tất cả các sơ đồ hiện có trong đường tìm kiếm. Lựa chọn boolean xác định liệu có hay không các sơ đồ hệ thống được ngầm định đưa vào như pg_catalog được đưa vào trong đường tìm kiếm được trả về.
Lưu ý: Đường tìm kiếm có thể được tùy chỉnh theo thời gian chạy. Lệnh đó là:
SET search_path TO schema [, schema, ...]
pg_listening_channels trả về một tập hợp các tên các kênh mà phiên hiện hành đang nghe. Xem
LISTEN để có thêm thông tin.
inet_client_addr trả về địa chỉ IP của máy trạm hiện hành, và inet_client_port trả về số cổng.
inet_server_addr trả về địa chỉ IP trong đó máy chủ đó đã chấp nhận kết nối hiện hành, và
inet_server_port trả về số cổng. Tất cả các hàm đó trả về NULL nếu kết nối hiện hành là thông qua một socket miền Unix.
pg_my_temp_schema trả về OID của sơ đồ tạm thời phiên hiện hành, hoặc 0 nếu nó không có (vì nó đã không tạo ra bất kỳ bảng tạm nào). pg_is_other_temp_schema trả về true nếu OID được đưa ra là OID của một sơ đồ tạm của phiên khác. (Điều này có thể được sử dụng, ví dụ, để loại trừ các bảng tạm của phiên khác khỏi hiển thị trong một catalog).
pg_postmaster_start_time trả về timestamp with time zone khi máy chủ được khởi động.
pg_conf_load_time trả về timestamp with time zone khi các tệp cấu hình máy chủ đã được tải lên mới nhất. (Nếu phiên hiện hành là sống khi đó, thì đây sẽ là thời gian khi bản thân phiên đó đọc lại các tệp cấu hình, sao cho việc đọc sẽ khác nhau một chút trong các phiên khác nhau. Nếu không thì đây là thời gian khi qui trình chủ (postmaster) đọc lại các tệp cấu hình).
version trả về một chuỗi mô tả phiên bản máy chủ PostgreSQL.
Bảng 9-48 liệt kê các hàm cho phép người sử dụng truy vấn các quyền ưu tiên truy cập đối tượng lập trình. Xem Phần 5.6 để có thêm thông tin về các quyền ưu tiên.
Bảng 9-48. Các hàm yêu cầu quyền ưu tiên truy cập
Hàm Dạng
trả về Mô tả
has_any_column_privilege(user, table, privilege) boolean người sử dụng có quyền ưu tiên cho bất kỳ cột nào của bảng
has_any_column_privilege(table, privilege) boolean người sử dụng hiện hành có quyền ưu tiên cho bất kỳ cột nào của bảng
has_column_privilege(user, table, column, privilege) boolean người sử dụng có quyền ưu tiên cho cột
has_column_privilege(table, column, privilege) boolean người sử dụng hiện hành có quyền ưu tiên cho cột has_database_privilege(user, database, privilege) boolean người sử dụng có quyền ưu tiên cho cơ sở dữ liệu has_database_privilege(database, privilege) boolean người sử dụng hiện hành có quyền ưu tiên cho cơ sở
dữ liệu has_foreign_data_wrapper_privilege(user, fdw,
privilege) boolean người sử dụng có quyền ưu tiên cho trình gói lại dữ liệu bên ngoài
has_foreign_data_wrapper_privilege(fdw, privilege) boolean người sử dụng hiện hành có quyền ưu tiên cho trình gói lại dữ liệu bên ngoài
has_function_privilege(user, function, privilege) boolean người sử dụng có quyền ưu tiên cho hàm
has_function_privilege(function, privilege) boolean người sử dụng hiện hành có quyền ưu tiên cho hàm has_language_privilege(user, language, privilege) boolean người sử dụng có quyền ưu tiên cho ngôn ngữ has_language_privilege(language, privilege) boolean người sử dụng hiện hành có quyền ưu tiên cho ngôn
ngữ
has_schema_privilege(user, schema, privilege) boolean người sử dụng có quyền ưu tiên cho sơ đồ
has_schema_privilege(schema, privilege) boolean người sử dụng hiện hành có quyền ưu tiên cho sơ đồ has_server_privilege(user, server, privilege) boolean người sử dụng có quyền ưu tiên cho máy chủ ngoài has_server_privilege(server, privilege) boolean người sử dụng hiện hành có quyền ưu tiên cho máy
chủ ngoài
has_sequence_privilege(user, sequence, privilege) boolean người sử dụng có quyền ưu tiên cho sự tuần tự has_sequence_privilege(sequence, privilege) boolean người sử dụng hiện hành có quyền ưu tiên cho sự tuần
tự
has_table_privilege(user, table, privilege) boolean người sử dụng có quyền ưu tiên cho bảng
has_table_privilege(table, privilege) boolean người sử dụng hiện hành có quyền ưu tiên cho bảng has_tablespace_privilege(user, tablespace, privilege) boolean người sử dụng có quyền ưu tiên cho không gian bảng has_tablespace_privilege(tablespace, privilege) boolean người sử dụng hiện hành có quyền ưu tiên cho không
gian bảng
pg_has_role(user, role, privilege) boolean người sử dụng có quyền ưu tiên cho vai trò
has_table_privilege kiểm tra liệu một người sử dụng có thể truy cập một bảng theo một cách thức đặc biệt hay không. Người sử dụng có thể được chỉ định bằng tên hoặc bằng OID (pg_authid.oid), hoặc nếu đối số bị làm mờ current_user được giả thiết. Bảng đó có thể được chỉ định bằng tên hoặc bằng OID. (Vì thế, thực sự có 6 phương án của has_table_privilege, nó có thể nhờ số lượng dạng các đối số của chúng phân biệt). Khi chỉ định bằng tên, thì tên đó có thể được định tính theo sơ đồ nếu cần
thiết. Dạng quyền ưu tiên truy cập mong muốn được chỉ định bằng một chuỗi văn bản, nó phải đánh giá theo một trong các giá trị SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES hoặc
TRIGGER. Như một sự lựa chọn, WITH GRANT OPTION có thể được bổ sung vào một dạng quyền ưu tiên để kiểm thử liệu quyền ưu tiên đó có được giữ với lựa chọn được trao hay không. Hơn nữa, các dạng nhiều quyền ưu tiên có thể được liệt kê tách bạch nhau bằng dấu phẩy, trong trường hợp đó kết quả sẽ là true nếu bất kỳ quyền ưu tiên được liệt kê nào được giữ. (Trường hợp chuỗi quyền ưu tiên là không đáng kể, và các dấu trắng thừa ra được phép ở giữa nhưng không bên trong các tên quyền ưu tiên). Một số ví dụ:
SELECT has_table_privilege(’myschema.mytable’, ’select’);
SELECT has_table_privilege(’joe’, ’mytable’, ’INSERT, SELECT WITH GRANT OPTION’);
has_sequence_privilege kiểm tra liệu một người sử dụng có thể truy cập một sự tuần tự theo một cách thức đặc biệt hay không. Các khả năng cho các đối số của nó là tương tự như has_table_privilege. Dạng quyền ưu tiên truy cập mong muốn phải đánh giá với một trong số USAGE, SELECT hoặc
UPDATE.
has_any_column_privilege kiểm tra liệu một người sử dụng có thể truy cập bất kỳ cột nào của một bảng theo một cách thức đặc biệt hay không. Các khả năng đối số của nó là tương tự với
has_table_privilege, ngoại trừ là dạng quyền ưu tiên truy cập mong muốn phải đánh giá một số kết hợp của SELECT, INSERT, UPDATE hoặc REFERENCES. Lưu ý rằng việc có bất kỳ các quyền ưu tiên đó ở mức bảng ngầm trao nó cho từng cột của bảng đó, nên has_any_column_privilege sẽ luôn trả về true nếu has_table_privilege làm vì các đối số y hệt. Nhưng has_any_column_privilege cũng thành công nếu có một sự trao mức cột quyền ưu tiên cho ít nhất một cột.
has_column_privilege kiểm tra liệu một người sử dụng có thể truy cập một cột theo một cách thức đặc biệt hay không. Các khả năng đối số của nó là tương tự với has_table_privilege, với sự bổ sung rằng cột đó có thể được chỉ định hoặc bằng tên hoặc số thuộc tính. Dạng quyền ưu tiên truy cập mong muốn phải đánh giá với một số kết hợp của SELECT, INSERT, UPDATE hoặc REFERENCES. Lưu ý rằng việc có bất kỳ quyền ưu tiên đó ở mức bảng ngầm định trao nó cho từng cột của bảng đó.
has_database_privilege kiểm tra liệu một người sử dụng có thể truy cập được một cơ sở dữ liệu theo một cách thức đặc biệt hay không. Các khả năng đối số của nó là tương tự với has_table_privilege. Dạng các quyền ưu tiên truy cập mong muốn phải đánh giá với một số kết hợp của CREATE, CONNECT, TEMPORARY hoặc TEMP (nó là tương đương với TEMPORARY).
has_function_privilege kiểm tra liệu một người sử dụng có thể truy cập một hàm theo một cách thức đặc biệt hay không. Các khả năng đối số của nó là tương tự với has_table_privilege. Khi chỉ định một hàm bằng một chuỗi văn bản thay vì bằng OID, đầu vào được phép là tên như đối với dạng dữ liệu
regprocedure (xem Phần 8.16). Dạng quyền ưu tiên truy cập mong muốn phải đánh giá với EXECUTE. Một ví dụ là:
SELECT has_function_privilege(’joeuser’, ’myfunc(int, text)’, ’execute’);
has_foreign_data_wrapper_privilege kiểm tra liệu một người sử dụng có thể truy cập một bộ đóng gói dữ liệu ngoài theo một cách đặc biệt hay không. Các khả năng đối số của nó là tương tự với
has_table_privilege. Dạng quyền ưu tiên truy cập mong muốn phải đánh giá với USAGE.
has_language_privilege kiểm tra liệu một người sử dụng có thể truy cập một ngôn ngữ thủ tục theo một cách thức đặc biệt hay không. Các khả năng đối số của nó là tương tự với has_table_privilege. Dạng quyền ưu tiên truy cập mong muốn phải đánh giá với USAGE.
has_schema_privilege kiểm tra liệu một người sử dụng có thể truy cập một sơ đồ theo một cách đặc biệt hay không. Các khả năng đối số của nó là tương tự với has_table_privilege. Dạng quyền ưu tiên truy cập mong muốn phải đánh giá với một số kết hợp của CREATE hoặc USAGE.
has_server_privilege kiểm tra liệu một người sử dụng có thể truy cập được một máy chủ ngoài theo một cách đặc biệt hay không. Các khả năng đối số của nó là tương tự với has_table_privilege. Dạng quyền ưu tiên truy cập mong muốn phải đánh giá theo USAGE.
has_tablespace_privilege kiểm tra liệu một người sử dụng có thể truy cập một không gian bảng theo một cách thức đặc biệt hay không. Các khả năng đối số của nó là tương tự với has_table_privilege. Dạng quyền ưu tiên truy cập mong muốn phải đánh giá theo CREATE.
pg_has_role kiểm tra liệu một người sử dụng có thể truy cập một vai trò theo một cách đặc biệt hay không. Các khả năng đối số của nó là tương tự với has_table_privilege. Dạng quyền ưu tiên truy cập mong muốn phải đánh giá theo một số kết hợp của MEMBER hoặc USAGE. MEMBER biểu thị quan hệ thành viên trực tiếp hoặc gián tiếp trong vai trò đó (đó là, quyền để thực hiện SET ROLE), trong khi
USAGE biểu thị việc liệu các quyền ưu tiên của vai trò đó có sẵn sàng ngay lập tức mà không phải thực hiện SET ROLE hay không.
Bảng 9-49 chỉ ra các hàm xác định liệu một đối tượng nhất định có là trực quan hay không trong đường tìm kiếm sơ đồ hiện hành. Ví dụ, một bảng được nói sẽ là trực quan nếu sơ đồ bao gồm của nó là trong đường tìm kiếm và không có bảng cùng y hệt tên nào xuất hiện trước đó trong đường tìm kiếm đó. Điều này tương đương với tuyên bố rằng bảng đó có thể được tham chiếu tới bằng tên không có khả năng sơ đồ rõ ràng. Để liệt kê các tên của tất cả các bảng nhìn thấy được:
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
Bảng 9-49. Các hàm đòi hỏi sự trực quan sơ đồ
Hàm Dạng trả về Mô tả
pg_conversion_is_visible(conversion_oid) boolean là biến đổi nhìn thấy trong đường tìm kiếm pg_function_is_visible(function_oid) boolean là hàm nhìn thấy trong đường tìm kiếm pg_operator_is_visible(operator_oid) boolean là toán tử nhìn thấy trong đường tìm kiếm pg_opclass_is_visible(opclass_oid) boolean là lớp toán tử nhìn thấy trong đường tìm kiếm pg_table_is_visible(table_oid) boolean là bảng nhìn thấy trong đường tìm kiếm
pg_ts_config_is_visible(config_oid) boolean là cấu hình tìm kiếm văn bản nhìn thấy trong đường tìm kiếm
pg_ts_dict_is_visible(dict_oid) boolean là thư mục tìm kiếm văn bản nhìn thấy trong đường tìm kiếm
pg_ts_parser_is_visible(parser_oie) boolean là trình phân tích tìm kiếm văn bản nhìn thấy trong
Hàm Dạng trả về Mô tả đường tìm kiếm
pg_ts_template_is_visible(templateoid) boolean là mẫu template tìm kiếm văn bản nhìn thấy trong đường tìm kiếm
pg_type_is_visible(type_oid) boolean là dạng (hoặc miền) nhìn thấy trong đường tìm kiếm
Từng hàm thực thi kiểm tra tính trực quan cho một dạng đối tượng cơ sở dữ liệu. Lưu ý rằng
pg_table_is_visible cũng có thể được sử dụng với các kiểu nhìn, các chỉ số và các tuần tự;
pg_type_is_visible cũng có thể được sử dụng với các miền. Đối với các hàm và toán tử, một đối tượng trong đường tìm kiếm là nhìn thấy nếu không có đối tượng nào cùng tên y hệt và (các) dạng dữ liệu của đối số trước đó trong đường tìm kiếm. Đối với các lớp toán tử, cả tên và phương pháp truy cập chỉ số có liên quan được xem xét.
Tất cả các hàm đó đòi hỏi các OID đối tượng để nhận diện đối tượng sẽ được kiểm tra. Nếu bạn muốn kiểm tra một đối tượng theo tên, là thuận tiện để sử dụng các dạng tên hiệu (alias) OID (regclass, regtype, regprocedure, regoperator, regconfig hoặc regdictionary), ví dụ:
SELECT pg_type_is_visible(’myschema.widget’::regtype);
Lưu ý là có thể không có nhiều ý nghĩa để kiểm thử một tên dạng không được định tính theo sơ đồ theo cách này - nếu tên đó có thể được thừa nhận, thì nó phải là nhìn thấy được.
Bảng 9-50 liệt kê các hàm trích thông tin từ các catalog hệ thống.
Bảng 9-50. Các hàm thông tin catalog hệ thống.
Tên Dạng trả
về Mô tả
format_type(type_oid, typemod) text có tên SQL của một dạng dữ liệu
pg_get_keywords() setof record có danh sách các từ khóa SQL và các chủng loại của chúng pg_get_constraintdef(constrainoid) text có định nghĩa của một ràng buộc
pg_get_constraintdef(constraint_oid,
pretty_bool) text có định nghĩa của một ràng buộc
pg_get_expr(expr_text, relation_oid) text dịch ngược mẫu nội bộ của biểu thức, giả thiết là bất kỳ Vars nào trong đó cũng tham chiếu tới quan hệ được tham số thứ 2 chỉ ra pg_get_expr(expr_text, relation_oid,
pretty_bool) text dịch ngược mẫu nội bộ của biểu thức, giả thiết là bất kỳ Vars nào trong đó cũng tham chiếu tới quan hệ được tham số thứ 2 chỉ ra pg_get_functiondef(func_oid) text có định nghĩa của một hàm
pg_get_function_arguments(func_oid) text có danh sách đối số định nghĩa hàm (với các giá trị mặc định) pg_get_function_identity_arguments(f
unc_oid)
text có danh sách đối số để nhận diện hàm (với các giá trị mặc định) pg_get_function_result(func_oid) text có mệnh đề RETURNS cho hàm
pg_get_indexdef(index_oid) text có lệnh CREATE INDEX cho chỉ số pg_get_indexdef(index_oid,
column_no, pretty_bool)
text có lệnh CREATE INDEX cho chỉ số, hoặc định nghĩa của chỉ một cột chỉ số khi column_no không là 0