当前位置: 首页 > 知识库问答 >
问题:

如何使用变量在存储过程中执行授权?

贺福
2023-03-14

作为Hibernate中BLOB值的后期创建钩子的替代方法,我认为数据库内触发器是更好的解决方案,因此我尝试编写以下触发器:

CREATE FUNCTION lo_default_grant() RETURNS trigger AS $$
DECLARE
    lo_oid lo := NEW[TG_ARGV[0]];
BEGIN
    IF TG_OP = 'INSERT' THEN
        GRANT SELECT ON LARGE OBJECT lo_oid TO reader_role;
    ELSIF OLD[TG_ARGV[0]] != NEW[TG_ARGV[0]] THEN
        GRANT SELECT ON LARGE OBJECT lo_oid TO reader_role;
    END IF;
END;
$$ LANGUAGE plpgsql;

将与触发器一起使用,例如:

CREATE TRIGGER t_grant AFTER INSERT OR UPDATE ON my_entity
  FOR EACH ROW EXECUTE PROCEDURE lo_default_grant(file);

然而,我无法计算出构建GRANT语句的语法。

[2022-03-09 16:14:51][42601]ERROR:语法错误在或接近lo_oid
[2022-03-09 16:14:51]位置:279

真的不可能像在其他语句中那样使用变量吗?

共有1个答案

何烨华
2023-03-14

GRANT语句不可优化,因此不能直接将参数插入其中。也不能用动态字段名为行下标。

但是,PL/pgSQL具有EXECUTE语句,允许您构造包含所需语句的字符串:

CREATE OR REPLACE FUNCTION lo_default_grant() RETURNS trigger AS $$
DECLARE
    old_lo oid;
    new_lo oid;
BEGIN
    EXECUTE format('SELECT $1.%I', TG_ARGV[0]) USING OLD INTO old_lo;
    EXECUTE format('SELECT $1.%I', TG_ARGV[0]) USING NEW INTO new_lo;
    IF TG_OP = 'INSERT' OR old_lo != new_lo THEN
        EXECUTE format('GRANT SELECT ON LARGE OBJECT %s TO reader_role', new_lo);
    END IF;
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;
 类似资料:
  • 我创建了一个过程,如: 并试图像这样执行它: 但它会抛出以下错误: 错误:函数insert_user_ax_register(未知,未知,未知,带时区的时间戳,未知,未知,带时区的时间戳,未知,未知,未知,bigint)不存在SQL状态:42883提示:没有函数匹配给定的名称和参数类型。可能需要添加显式类型转换。角色: 16 请帮我解决这个问题。我是新来的pgsql,无法从谷歌找到任何解决方案。我

  • 我想使用Spring Data JPA和Hibernate执行一个简单的H2数据库存储过程。 存储过程类: 存储过程别名: 在H2控制台中执行,工作正常: Spring数据JPA存储库类: 储存库测试: 产生以下输出: 具有以下存储过程的MS SQL Server数据库的相同代码按预期工作: 似乎在org . spring framework . data . JPA . repository .

  • 授予Snowflake中所有存储过程的执行权限。 我想我需要添加执行权限,但我不知道在雪花中需要在哪里配置存储过程权限。 有人想给存储过程/表权限吗?

  • 问题内容: 如何在以后要在另一个控制器中访问的控制器中存储变量?例如: 我该怎么做? 问题答案: 在根范围内设置的变量可通过原型继承供控制器范围使用。 这是@Nitish演示的修改后的版本,它更加清楚地显示了这种关系:http : //jsfiddle.net/TmPk5/6/ 注意,在模块初始化时设置了rootScope的变量,然后每个继承的作用域都有自己的副本,可以独立设置(该函数)。另外,r

  • 问题内容: 简而言之:我正在尝试在Entity Framework中运行Oracle存储过程(我知道这听起来很奇怪,但是在一般应用程序中使用Entity Framework,但是由于修改密钥的限制,EF无法处理此特定命令。值)。 过程具有一些参数(仅IN),并更新表中的值。我通过运行测试了它: 它工作正常。 我的参数定义如下: 我的查询是: 我正在尝试从C#代码执行它。即通过运行: 我收到错误OR