LRI: không có lược đồ nào được chọn để tạo trong


38

Tôi đang làm việc trên một cơ sở dữ liệu postgresql của amazon nơi tôi biết đã có một số vấn đề với lược đồ công cộng (có thể nó đã bị hủy). Nhưng rõ ràng lược đồ tồn tại, và dù sao thì vấn đề vẫn chưa được giải quyết. Đây là một phiên mẫu với cơ sở dữ liệu trống mới được tạo:

mydb=> CREATE TABLE distributors (
mydb(>     did     integer,
mydb(>     name    varchar(40) UNIQUE
mydb(> );
ERROR:  no schema has been selected to create in
mydb=> show search_path;
  search_path   
----------------
 "$user",public
(1 row)

mydb=> create schema public;
ERROR:  schema "public" already exists

Có gợi ý nào không? Tôi nên tìm cái gì?

Giải quyết. Nhờ câu trả lời của Daniel Vérité tôi đã giải quyết như sau:

grant usage on schema public to public;
grant create on schema public to public;

Đây có phải là các quyền mặc định trên lược đồ công cộng?

Tôi có một người dùng có thể truy cập cơ sở dữ liệu, vì vậy tôi nghĩ rằng dù sao điều này cũng không thể làm tăng rủi ro bảo mật ...

Tôi nghĩ rằng tôi nên thực hiện sửa đổi tương tự trên template1 . Nó có đúng không? Làm cách nào để kiểm tra xem các quyền trong template1 có đúng không (giả sử giá trị mặc định)?


3
Có thể người dùng của bạn không có các đặc quyền cần thiết để tạo các bảng trong lược đồ công khai.
a_horse_with_no_name

Chỉnh sửa sau: có, kết nối với template1 và kiểm tra các quyền của lược đồ (xem câu trả lời được chỉnh sửa).
Daniel Vérité

Câu trả lời:


34

Điều này xảy ra khi không có USAGEđặc quyền trên bất kỳ lược đồ nào search_path. Theo mặc định, vai trò giả public(tất cả người dùng) có đặc quyền này trên publiclược đồ, vì vậy lỗi này chỉ xảy ra sau khi thu hồi nó một cách rõ ràng với:

revoke usage on schema public from public;

Điều này là bắt buộc khi mọi người không muốn nhìn vào lược đồ của người khác, ngay cả khi không chọn dữ liệu từ các bảng (được cấp thông qua các đặc quyền khác nhau).

Nếu điều REVOKEnày chưa được thực hiện trong cơ sở dữ liệu đó, thì nó có thể đã xảy ra trong cơ sở dữ liệu mẫu mà cơ sở dữ liệu mới được mô hình hóa (xem CREATE DATABASE).


Khi người dùng có USAGEđặc quyền, nhưng thiếu CREATEđặc quyền trên lược đồ, đó là một lỗi khác khi cố gắng tạo một đối tượng: quyền bị từ chối đối với lược đồ công khai .

Để kiểm tra các đặc quyền bên trong psql, sử dụng \dn+ public.

Theo mặc định (hiển thị với màn hình mở rộng \xđể dễ đọc):

# \ dn + công khai
Danh sách các lược đồ
- [GHI 1] ----- + -----------------------
Tên | công cộng
Chủ sở hữu | bưu điện
Đặc quyền truy cập | postgres = UC / postgres
                  | = UC / postgres
Mô tả | lược đồ công cộng tiêu chuẩn

thiếu một rolename trước =có nghĩa là nó cho tất cả các vai trò (= công khai)

Không có đặc quyền USAGE công cộng

Tên | công cộng
Chủ sở hữu | bưu điện
Đặc quyền truy cập | postgres = UC / postgres
                  | = C / postgres
Mô tả | lược đồ công cộng tiêu chuẩn

Không có đặc quyền SỬ DỤNG hoặc TẠO công khai

Tên | công cộng
Chủ sở hữu | bưu điện
Đặc quyền truy cập | postgres = UC / postgres
Mô tả | lược đồ công cộng tiêu chuẩn

Cảm ơn, điều này đã giải quyết! (Tôi sẽ viết một ghi chú trong câu hỏi).
Emanuele Paolini

3

Tôi đã có tệp pgdump với việc tạo các hàm trong lược đồ tùy chỉnh và tôi muốn chuyển tên lược đồ tùy chỉnh thành chung chung và thay thế tất cả các lần xuất hiện với lược đồ cũ thành trống (ví dụ: myschema.tablename thành tablename) Và bắt đầu nhận lỗi

ERROR:  no schema has been selected to create in

Đối với trường hợp của tôi, lỗi xảy ra khi ở đầu dòng kết xuất

SELECT pg_catalog.set_config('search_path', '', false);

Tôi đã thay đổi arg thứ hai thành "công khai"

SELECT pg_catalog.set_config('search_path', 'public', false);

Và vấn đề đã biến mất

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.