Cách nhanh nhất để có được OID của người dùng hiện tại trong Postgres?


7

Tôi đang nghĩ đến việc lưu trữ OID của người dùng trong cột "chủ sở hữu" của bảng, vì vậy tôi không phải làm gì nếu họ thay đổi tên người dùng.

Tôi hiểu rằng người ta có thể sử dụng pg_has_role () với OID, vì vậy điều đó tốt.

Có cách nào nhanh chóng và dễ dàng để lấy OID của người dùng hiện tại mà không cần kết hợp nó với một trong các bảng hệ thống không?

Câu trả lời:


11

Cách nhanh nhất mà tôi biết là tìm kiếm trong giao diện danh mục hệ thống pg_roles:

SELECT * FROM pg_roles WHERE rolname = 'postgres';

Nói một cách chính xác, việc sử dụng bảng bên dưới sẽ nhanh hơn một chút pg_authid, nhưng việc truy cập vào bảng này bị hạn chế đối với các siêu nhân vì những lý do chính đáng.

Không loại định danh đối tượng như cho bảng hoặc loại, điều này sẽ cho phép tạo kiểu đơn giản như thế 'mytable'::regclass.

Mặc dù vậy, hãy lưu ý rằng các OID không ổn định trong chu kỳ kết xuất / khôi phục. Vì vậy, OIDkhông tốt cho trường hợp sử dụng!

Trong một số cơ sở dữ liệu, tôi có một loginbảng riêng với khóa chính nối tiếp mà tôi sử dụng cho các mục đích tương tự. Duy trì bằng tay. Và các chức năng sử dụng nó được chuẩn bị để thỉnh thoảng không tìm thấy người dùng trong bảng này. Một bảng rất cơ bản và nhanh chóng:

CREATE TABLE users.login (
  login_id serial PRIMARY KEY 
 ,username text NOT NULL UNIQUE
);

Khi tạo người dùng mới, tôi sử dụng hàm plpgsql để tạo người dùng mới trong hệ thống và nhập nó vào bảng của tôi cùng một lúc. Và tôi sử dụng nó login_idnhiều nơi . Chẳng hạn, tôi theo dõi ai đã thực hiện thay đổi cuối cùng thành một hàng trong hầu hết các bảng. Tôi sử dụng chức năng đơn giản này:

CREATE OR REPLACE FUNCTION public.f_login_id()
  RETURNS int AS
$func$
SELECT COALESCE((SELECT login_id FROM users.login
                 WHERE  username = session_user::text), 0::int)
$func$ LANGUAGE sql STABLE;

Không có ràng buộc khóa ngoại để giữ cho mọi thứ nhanh chóng và đơn giản. Rõ ràng, tôi không cần tính toàn vẹn tham chiếu nghiêm ngặt ...


Khỉ thật. Dù sao cũng cảm ơn. Bạn có thể mô tả bảng / hệ thống đăng nhập của bạn một chút?
Neil McGuigan

1
@NeilMcGuigan: Tôi đã thêm bố cục cơ bản cho thiết kế rất đơn giản của mình.
Erwin Brandstetter
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.