PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana search_path mempengaruhi resolusi pengenal dan skema saat ini?

Apakah jalur pencarian skema search_path ?

Panduan:

[...] tabel sering disebut dengan nama wajar tanpa pengecualian, yang hanya terdiri dari nama tabel. Sistem menentukan tabel mana yang dimaksud dengan mengikuti jalur penelusuran, yaitu daftar skema yang harus dilihat .

Penekanan saya yang berani. Ini menjelaskan resolusi pengenal .

“Skema saat ini” (atau “skema default”) adalah, per dokumentasi:

Skema pertama bernama di jalur penelusuran disebut skema saat ini . Selain sebagai skema pertama yang dicari, juga merupakan skema di mana tabel baru akan dibuat jika CREATE TABLE perintah tidak menentukan nama skema.

Penekanan saya yang berani. Skema sistem pg_temp (skema untuk objek sementara dari sesi saat ini) dan pg_catalog secara otomatis menjadi bagian dari jalur pencarian dan dicari pertama , dalam urutan ini. Panduan:

pg_catalog selalu efektif menjadi bagian dari jalur pencarian. Jika tidak disebutkan namanya secara eksplisit di jalurnya maka secara implisit dicari sebelum mencari skema jalur. Ini memastikan bahwa nama bawaan akan selalu dapat ditemukan. Namun, Anda dapat secara eksplisit menempatkan pg_catalog di akhir jalur pencarian Anda jika Anda lebih suka nama yang ditentukan pengguna menggantikan nama bawaan.

Penekanan tebal sesuai aslinya. Dan pg_temp datang sebelum itu, kecuali jika ditempatkan pada posisi yang berbeda.

Bagaimana cara mengaturnya?

Ada berbagai cara untuk menyetel variabel runtime search_path .

  1. Tetapkan kluster -wide default untuk semua peran di semua database di postgresql.conf (dan memuat ulang). Hati-hati dengan itu!

    search_path = 'blarg,public'
    

    Default yang dikirimkan untuk pengaturan ini adalah:

    search_path = "$user",public
    

    Elemen pertama menentukan bahwa skema dengan nama yang sama dengan pengguna saat ini akan dicari. Jika tidak ada skema seperti itu, entri akan diabaikan.

  2. Tetapkan sebagai default untuk satu database :

    ALTER DATABASE test SET search_path = blarg,public;
    
  3. Tetapkan sebagai default untuk peran Anda terhubung dengan (efektif untuk seluruh cluster):

    ALTER ROLE foo SET search_path = blarg,public;
    
  4. Atau bahkan (seringkali terbaik!) sebagai default untuk peran dalam database :

    ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
    
  5. Tulis perintah di bagian atas skrip Anda. Atau jalankan di sesi DB Anda :

    SET search_path = blarg,public;
    
  6. Setel search_path specific tertentu untuk lingkup fungsi (agar aman dari pengguna jahat dengan hak istimewa yang memadai). Baca tentang Menulis SECURITY DEFINER Berfungsi Aman di manual.

CREATE FUNCTION foo() RETURNS void AS
$func$
BEGIN
   -- do stuff
END
$func$ LANGUAGE plpgsql SECURITY DEFINER
       SET search_path=blarg,public,pg_temp;

Angka yang lebih tinggi dalam daftar saya mengalahkan angka yang lebih rendah.
Manual memiliki lebih banyak cara , seperti menyetel variabel lingkungan atau menggunakan opsi baris perintah.

Untuk melihat setelan saat ini:

SHOW search_path;

Untuk menyetel ulang:

RESET search_path;

Panduan:

Nilai default didefinisikan sebagai nilai yang akan dimiliki parameter, jika tidak ada SET pernah dikeluarkan untuk itu di sesi saat ini.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql :Koneksi ditolak. Periksa apakah nama host dan port sudah benar dan postmaster menerima koneksi TCP/IP

  2. Praktik Terbaik Keamanan PostgreSQL

  3. Mengapa pg_restore berhasil kembali tetapi tidak benar-benar memulihkan database saya?

  4. Postgres:Bagaimana cara mengubah string json menjadi teks?

  5. Pilih baris acak dari tabel PostgreSQL dengan probabilitas baris tertimbang