小编Kat*_*rin的帖子

有没有办法部分初始化 TYPE?

我创建了一个自定义类型:

CREATE TYPE my_type as(name text, street text, location text);
Run Code Online (Sandbox Code Playgroud)

初始化这样的类型很容易:

SELECT ROW('a', 'b', 'c')::my_type;
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种简单的方法可以部分初始化类型,这意味着所有未提及的列都隐式设置为 null。在伪代码中,类似于:

SELECT ROW('a', 'c')::my_type(name, location);
Run Code Online (Sandbox Code Playgroud)

另外,当列未按正确顺序提及时,是否还有一种初始化类型的方法?在伪代码中,类似于:

SELECT ROW('c', 'a', 'b')::my_type(location, name, street);
Run Code Online (Sandbox Code Playgroud)

postgresql syntax datatypes cast composite-types

6
推荐指数
1
解决办法
899
查看次数

带有 SELECT 的 SQL 函数与带有 RETURN QUERY SELECT 的 PLPGSQL 函数?

执行 SQL 查询的普通 SQL 函数之间是否有区别:

create function get_sports() returns setof sport as
$body$
    select * from sport;
$body$
language sql stable;
Run Code Online (Sandbox Code Playgroud)

和 PLPGSQL 函数返回相同的 SQL 查询:

create function get_sports() returns setof sport as
$body$
begin
    return query select * from sport;
end
$body$
language plpgsql stable;
Run Code Online (Sandbox Code Playgroud)

关于性能?在什么情况下应该使用哪个版本?

如果我们传递参数,那会改变什么吗?如:

create function get_sports(status int) returns setof sport as
$body$
    select * from sport where status = $1;
$body$
language sql stable;

create function get_sports(status int) returns setof sport as
$body$
begin
    return …
Run Code Online (Sandbox Code Playgroud)

postgresql performance plpgsql functions postgresql-performance

5
推荐指数
1
解决办法
1915
查看次数

只允许通过函数访问表,而不是直接通过查询访问表

我有一个表t和一些可以访问的函数t。例如:

create function list_t() returns setof t as $$
    select * from t;
$$ language sql stable;
Run Code Online (Sandbox Code Playgroud)

是否可以将角色权限定义为仅允许执行list_t(),而不允许普通SELECTUPDATE和查询DELETEINSERTt

我尝试了以下方法:

grant execute on all functions in schema public to my_user;
revoke all on t from my_user;
Run Code Online (Sandbox Code Playgroud)

虽然这确实不允许SELECT * FROM t,但也不允许SELECT list_t()

postgresql permissions role acl

4
推荐指数
1
解决办法
981
查看次数