Trong PostgreSQL, schema là một tập hợp các đối tượng (bảng, view, index, function,…). Schema là một phần của database.

Trong bài viết này, tôi sẽ hướng dẫn các bạn các thao tác quản trị thường gặp với Schema.


   Xem thông tin về schema

Như tôi đã nói ở trên, schema là một phần của database, do đó, bạn cần phải kết nối vào database trước rồi mới xem các schema thuộc database đó. Ở đây tôi sử dụng psql để thực hành nhé.

psql

psql (13.2)
Type "help" for help.
postgres=# \c test
You are now connected to database "test" as user "postgres".

test=# \dn+

Ở câu lệnh trên, tôi đã dùng lệnh \c test để kết nối vào database test. Tiếp theo tôi gõ lệnh \dn+ để liệt kê tất cả thông tin schema của database test đang có. Kết quả sẽ như sau:

Như các bạn thấy, hiện tôi đang có 2 schema là: pgagentpublic.


   Tại sao lại cần đến Schema?

 

  Để giúp bạn tổ chức các nhóm đối tượng liên quan với nhau trong cùng 1 database. VD: các bảng thuộc nghiệp vụ kế toán, nhân sự sẽ có schema riêng.

  Schema cũng như 1 database tự trị thu nhỏ được tạo ra dành riêng cho 1 user hay nhóm con user nào đó, mà không ảnh hưởng đến những user còn lại trong database. Bạn hoàn toàn có thể đặt tên bảng giống nhau, chỉ cần khác schema là được.

Đọc thêm  Cách xem thông tin về một bảng trong PostgreSQL

Để truy cập 1 đối tượng trong schema, ta dùng cấu trúc <tên Schema>.<tên đối tượng>

Giả sử tôi muốn xem dữ liệu của bảng customer thuộc schema duy, tôi gõ lệnh như sau:

select * from duy.customer;

   Public Schema là gì?

 

PostgreSQL mặc định sẽ tạo ra 1 schema mỗi khi 1 database được tạo ra. Đó là schema public. Mỗi khi bạn tạo ra 1 đối tượng gì mà không chỉ ra tên schema cụ thể, nó sẽ được đặt vào trong schema public.

VD: 2 câu lệnh sau là tương đương về kết quả:

create table customer ( id int4, name text);
create table public.customer ( id int4, name text);

Bạn hoàn toàn có thể thay đổi hành vi này để mỗi khi tạo 1 đối tượng mới mà không chỉ ra schema, nó sẽ tự đặt đối tượng vào schema mà bạn muốn. Sử dụng search_path để làm điều đó.


   Cách sử dụng search_path

 

Search_path là 1 tham số quy định danh sách schema mà PostgreSQL sẽ sử dụng để tìm hay tạo 1 đối tượng nào đó. Bạn có thể xem giá trị search_path hiện tại bằng câu lệnh sau:

show search_path ;
   search_path   
-----------------
 "$user", public
(1 row)

Như các bạn thấy, search_path là 1 danh sách bao gồm: $user tức là tên user đang kết nối vào (VD là user duy đang kết nối vào chẳng hạn), tiếp theo là public.

Điều đó có nghĩa là, nếu bạn tạo 1 đối tượng mà không chỉ ra schema, PostgreSQL sẽ cố gắng tìm schema có tên trùng với user mà bạn dùng để đăng nhập trước để đặt đối tượng vào đó, nếu schema đó không tồn tại, nó sẽ tạo đối tượng ở schema tiếp theo trong search_path, đó là public.

Đọc thêm  Export Import dữ liệu cơ bản bằng pg_dump trong PostgreSQL

Giờ thì bạn đã hiểu, tại sao ở ví dụ trước, khi tôi tạo 1 bảng mà không chỉ ra schema, nó sẽ được đặt vào trong public rồi chứ. Bây giờ bạn thử tạo 1 schema có tên trùng với tên user bạn sử dụng để đăng nhập và tạo lại bảng, sau đó bạn kiểm tra lại xem bảng đó đã được đặt vào schema nào.

VD ở đây tôi đang đăng nhập bằng user postgres tạo ra 1 schema cũng tên là postgres

create schema postgres;
CREATE SCHEMA
test=# 
test=# 
test=# \dn+
                           List of schemas
   Name   |   Owner   |  Access privileges   |      Description       
----------+-----------+----------------------+------------------------
 pgagent  | admin     |                      | pgAgent system tables
 postgres | postgres  |                      | 
 public   | postgres  | postgres=UC/postgres+| standard public schema
          |           | =UC/postgres        +| 
          |           | tms_test=U/postgres  | 
(3 rows)

test=# 
test=# create table test (id int4, name text);
CREATE TABLE
test=# 
test=# select * from test;
 id | name 
----+------
(0 rows)

test=# select * from postgres.test;
 id | name 
----+------
(0 rows)

test=# select * from public.test;
ERROR:  unrecognized configuration parameter "myapp.myvar"

   Xóa bỏ Schema

 

Để xóa bỏ 1 schema và tất cả các đối tượng nằm trong schema, bạn sử dụng lệnh sau:

drop schema <tên schema> cascade;

Tham số cascade sẽ cho phép bạn xóa schema cùng tất cả các thành phần bên trong của nó.

Nguồn: https://dangxuanduy.com/

Xin cho tôi được biết, bạn cảm thấy bài viết này như thế nào? Ý kiến của bạn sẽ giúp tôi nâng cao chất lượng bài viết của mình.

    Hãy chia sẻ bài viết này nếu bạn thấy có ích nhé
    5 1 vote
    Article Rating
    Subscribe
    Notify of
    guest
    0 Comments
    Inline Feedbacks
    View all comments