pg_catalog
Şemadaki nesneler dolaylı olarak search_path
( dokümanlar ) içinde olduğundan, bu şemaya uzantıların yüklenmesi önerilir mi?
pg_catalog
Şemadaki nesneler dolaylı olarak search_path
( dokümanlar ) içinde olduğundan, bu şemaya uzantıların yüklenmesi önerilir mi?
Yanıtlar:
Uzantıları yüklemeyin pg_catalog
(bu varsayılan değilse: çok az sayıda uzantı bu şekilde tasarlanır), çünkü sistem kataloğuyla uğraşmazsınız . @Chris bunun bir nedeni olduğunu gösteriyor. Başkaları da var.
Ancak, "kamu" şeması hiçbir şekilde özel değildir . Bu, standart dağıtımlara önceden yüklenmiş olan varsayılan şemadır, böylece hemen başlayabiliriz. Bazı DB yöneticileri "genel" şemayı hiç kullanmaz, hatta bazıları siler.
CREATE EXTENSION
"genel" şemaya bağlı değildir. Aksi belirtilmedikçe geçerli şemaya yüklenir - ancak bazı uzantıların önceden ayarlanmış bir şeması olması ( PGQ / Londiste gibi ). Dökümantasyon:
schema_name
Uzantının içeriğinin taşınmasına izin verdiği göz önüne alındığında, uzantının nesnelerinin yükleneceği şemanın adı. Adlandırılmış şema zaten var olmalıdır. Belirtilmezse ve uzantının kontrol dosyası da bir şema belirtmezse , geçerli varsayılan nesne oluşturma şeması kullanılır .
Uzantının kendisinin herhangi bir şemada kabul edilmediğini unutmayın: uzantılar, veritabanı genelinde benzersiz olması gereken kalifiye olmayan adlara sahiptir. Ancak uzantıya ait nesneler şemalar içinde olabilir.
Cesur vurgu benim.
Kullanıcıları, şemaları ve aşağıdakileri nasıl yöneteceğinize karar verin search_path
:
Ardından uzantıların nereye yükleneceğine karar verin. İstediğiniz herhangi bir şemaya yükleyebilir ve bu şemayı varsayılan search_path
olarak tüm kullanıcılar için veya yalnızca bazı kullanıcılar için veya hiç kullanıcı için dahil edebilirsiniz (böylece nitelikli referanslar gerekir). Her şey neyi başarmak istediğinize bağlıdır.
Ne yaparsanız yapın, tutarlı olun.
Uzantıları (buna izin verir) "genel" (ve "$ user" - search_path
sonra kullanırsanız) varsayılan dahil varsayılan bir "uzantıları" şemasına yüklemek istiyorum . Kendi ortak işlevlerimin ve diğer ortak nesnelerimin temiz bir şekilde ayrılmasına yardımcı olur. Benim ayarım postgresql.conf
:
search_path = "$user",public,extensions
Veya:
search_path = public,extensions
Ve şu uzantıları yüklüyorum:
CREATE EXTENSION some_extension SCHEMA extensions;
Dikkat edilmesi gereken bir nokta: Bu şekilde extensions
şemadaki nesneleri (şemadaki niteliksiz) şemadaki aynı ada (ve parametrelere) sahip nesnelerin arkasına "gizleyebilirsiniz" public
.
İlişkili:
In PostgreSQL 9.0 and later, PL/pgSQL is installed by default. However it is still a loadable module, so especially security-conscious administrators could choose to remove it.
pg_catalog
. (Değiştirmeye çalışırsanız bir hata atar.) Bu, işlevler için yordamsal dil uzantılarını yüklemek için standart olabilir mi?
Uzantıları yüklemek pg_catalog
, bildiğim kadarıyla tavsiye edilmiyor. Varsayılan public
şemada da bulunan varsayılan şemayı kullanmalısınız search_path
.
Örnek olarak, pageinspect
daha önce public
şemada oluşturduğum uzantıyla çalışacağım . Tüm işlevler, varsayılan olarak, public
şemada bulunuyorlarsa veritabanındaki tüm şemalar tarafından erişilebilir durumdadır .
Şimdi, pg_catalog
şemaya taşıyarak
ALTER EXTENSION pageinspect SET SCHEMA pg_catalog;
ve gayet iyi çalışıyor.
Fakat...
Tekrar public
kullanarak şemaya geri taşımaya çalışın.
ALTER EXTENSION pageinspect SET SCHEMA public;
ve buna izin vermez, aşağıdaki hatayı verir
ERROR: cannot remove dependency on schema pg_catalog because it is a system object
SQL state: 0A000
Ah! Hareket ettirmeme izin vermeyecek bir sorun yok. Onu public
bırakıp yeniden oluşturarak şemaya geri alabilirim , değil mi? ...
DROP EXTENSION pageinspect;
CREATE EXTENSION pageinspect;
Tamam iyi. public
Şemada doğru yerde ve işlevler veritabanındaki tüm şemalar için hala erişilebilir.
TL, DR; public
Uzantılar için varsayılan şemayı kullanmanız yeterlidir.
plpgsql
uzantısı sonra bir şekilde bu kuralın bir istisnasıdır? Gördüğüm her kurulum pg_catalog