PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Thả hoặc tạo cơ sở dữ liệu từ quy trình được lưu trữ trong PostgreSQL

Thông báo lỗi chỉ rõ ràng như hướng dẫn sử dụng về điều này:

Một hàm plgpsql được bao quanh bởi một khối giao dịch tự động. Dài hạn và ngắn hạn của nó:bạn không thể làm điều đó - trực tiếp. Có lý do cụ thể nào khiến bạn không thể chỉ gọi lệnh DDL không?

DROP database $mydb;

Bạn có thể phá vỡ những hạn chế này bằng mô-đun bổ sung dblink as @Igor gợi ý. Bạn cần cài đặt nó một lần cho mỗi cơ sở dữ liệu - cơ sở dữ liệu mà bạn gọi các hàm dblink, không phải (cái khác) mà bạn thực thi các lệnh trong đó.
Cho phép bạn viết một hàm bằng cách sử dụng dblink_exec() như thế này:

CREATE OR REPLACE FUNCTION f_drop_db(text)
  RETURNS text LANGUAGE sql AS
$func$
SELECT dblink_exec('port=5432 dbname=postgres'
                  ,'DROP DATABASE ' || quote_ident($1))
$func$;

quote_ident() ngăn chặn việc chèn SQL có thể xảy ra.

Gọi:

SELECT f_drop_db('mydb');

Về thành công, bạn thấy:

Chuỗi kết nối thậm chí có thể trỏ đến cùng một db mà phiên của bạn chạy trong đó. Lệnh chạy bên ngoài khối giao dịch, điều này có hai hậu quả:

  • Nó không thể được khôi phục.
  • Nó cho phép bạn gọi DROP DATABASE "bằng proxy" từ bên trong một hàm.

Bạn có thể tạo FOREIGN DATA WRAPPERFOREIGN SERVER để lưu trữ kết nối và đơn giản hóa cuộc gọi:

CREATE FOREIGN DATA WRAPPER postgresql VALIDATOR postgresql_fdw_validator;

CREATE SERVER your_fdw_name_here FOREIGN DATA WRAPPER postgresql
OPTIONS (hostaddr '12.34.56.78', port '5432', dbname 'postgres');

Sử dụng bảo trì mặc định db postgres , đó sẽ là sự lựa chọn hiển nhiên. Nhưng bất kỳ db nào cũng có thể.

Chức năng đơn giản hóa sử dụng điều đó:

CREATE OR REPLACE FUNCTION f_drop_db(text)
  RETURNS text LANGUAGE sql AS
$func$
SELECT dblink_exec('your_fdw_name_here', 'DROP DATABASE ' || quote_ident($1))
$func$;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tính toán phần trăm chơi lại vào ngày hôm sau

  2. cú pháp khóa ngoại postgresql

  3. PostgreSQL tìm kết hợp phổ biến của các cặp trên cùng một cột

  4. PostgreSQL Tương đương với Gợi ý NoLock của SQLServer

  5. Thay đổi loại cột thành chuỗi dài hơn trong đường ray