Nei*_*gan 7 postgresql users postgresql-9.3
我正在考虑将用户的 OID 存储在表的“所有者”列中,因此如果他们更改了用户名,我无需执行任何操作。
我知道可以将 pg_has_role() 与 OID 一起使用,这很好。
是否有一种快速简便的方法来获取当前用户的 OID,而无需将其与系统表之一进行匹配?
Erw*_*ter 11
我所知道的最快方法是在系统目录视图中查找pg_roles:
SELECT * FROM pg_roles WHERE rolname = 'postgres';
Run Code Online (Sandbox Code Playgroud)
严格来说,使用底层 table 甚至会稍微快一点pg_authid,但是出于充分的理由限制超级用户访问它。
有没有 对象标识符类型像表或类型,这将允许一个简单的铸造等'mytable'::regclass。
但请注意,OID 在转储/恢复周期中不稳定。所以,这对用例OID没有好处!
在某些数据库中,我有一个单独的login表,其中包含用于类似目的的串行主键。手动维护。并且使用它的函数准备偶尔在此表中找不到用户。一个非常基本和快速的表:
CREATE TABLE users.login (
login_id serial PRIMARY KEY
,username text NOT NULL UNIQUE
);
Run Code Online (Sandbox Code Playgroud)
创建新用户时,我使用 plpgsql 函数在系统中创建新用户并同时将其输入到我的表中。我login_id在很多地方都使用它。例如,我跟踪谁对大多数表中的行进行了最后更改。我使用这个简单的功能:
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;
Run Code Online (Sandbox Code Playgroud)
没有外键约束,所以保持快速和简单。显然,我不需要严格的参照完整性......
| 归档时间: |
|
| 查看次数: |
5003 次 |
| 最近记录: |