Asp.net PostgreSQL错误42501:架构的权限被拒绝

Asp.net PostgreSQL错误42501:架构的权限被拒绝,asp.net,postgresql,stored-procedures,permissions,Asp.net,Postgresql,Stored Procedures,Permissions,我正在ASP.NET中使用PostgreSQL数据库构建一个用户注册系统,以维护用户信息。作为注册过程的一部分,将向用户发送一条确认消息,用户必须在其中单击链接以验证其电子邮件地址。这会将他们带到一个页面,在那里他们可以创建自己的密码 一旦用户提供了满足一些基本安全标准的密码,Web应用程序将运行两个PostgreSQL存储过程(函数),首先在数据库中创建用户角色并将其放入用户组,然后在数据库中创建一条记录,其中包含用户的“配置文件”详细信息(姓名、电子邮件地址等) 第一个存储过程(创建用户角色

我正在ASP.NET中使用PostgreSQL数据库构建一个用户注册系统,以维护用户信息。作为注册过程的一部分,将向用户发送一条确认消息,用户必须在其中单击链接以验证其电子邮件地址。这会将他们带到一个页面,在那里他们可以创建自己的密码

一旦用户提供了满足一些基本安全标准的密码,Web应用程序将运行两个PostgreSQL存储过程(函数),首先在数据库中创建用户角色并将其放入用户组,然后在数据库中创建一条记录,其中包含用户的“配置文件”详细信息(姓名、电子邮件地址等)

第一个存储过程(创建用户角色的存储过程)运行良好。然后,应用程序断开与数据库的连接,并作为新创建的用户重新连接,以运行第二个存储过程来创建概要文件记录。但是,这就是应用程序失败的地方,返回上面提到的错误
42501:schema的权限被拒绝…

我已经验证了正在创建新用户的用户组已被授予架构上的
用法
权限,并检查了数据库中每个受影响对象(概要文件表和存储过程)的所有权限,并且一切看起来都是正确的,但是我无法让我的Web应用程序创建新的“配置文件”记录

以下是两个存储过程(已编辑)供参考:

1)创建数据库用户角色(此操作正确,用户已创建)

2)创建“配置文件”记录(当Web应用程序作为新创建的用户连接到数据库时,此操作失败,出现
错误42501

您可能会注意到,我没有使用
安全定义器设置第二个存储过程。这是有意的,因为我更喜欢使用个人的安全凭据运行函数。然而,在我的测试中,即使我打开了
安全定义器
,我仍然会收到相同的“权限被拒绝”错误


所以,现在的问题是:我忽略了什么?我觉得我已经测试了权限设置的每一种排列方式,但在这个过程中我显然遗漏了一些东西。谢谢你的帮助。

看来我已经把它修好了。我回顾了模式上的所有权限设置,但这次我也回顾了所有“默认权限”。我将“systemusers”组设置为在表和序列上具有
SELECT
、在函数上具有
EXECUTE
、在类型上具有
USAGE
。当我再次测试时,我的存储过程正确运行,并按预期在数据库中创建了配置文件记录


所以,显然我忽略了一些相当重要的事情。即使使用我在特定对象上分配的所有单独权限设置,这些默认权限仍然没有按需要的方式设置。吸取的教训。

好的,现在它似乎间歇性工作。昨晚,我放弃了我的用户角色,删除了我的配置文件记录,并仔细检查了整个过程,然后又开始出现同样的错误-
错误:42501:架构的权限被拒绝
。是否可能存在某种“时间”问题,即PostgreSQL没有完全正确地应用用户权限?同样的情况也发生了:用户是在数据库中创建的,但它不会创建概要文件记录。我再次删除了用户角色并清除了所有其他引用,然后在服务器上重新启动了PostgreSQL服务并重试了一次。这次成功了。一定是数据库中的一些“工件”信息,或者别的什么。我意识到,不太可能有人会对此做出回应,但如果有人能解释为什么会发生这种情况,以及(更重要的是)我如何确保这种情况在未来不会发生,我很乐意听到。
CREATE OR REPLACE FUNCTION "SP_CreateUser"("User" character varying, "Pass" character varying)
  RETURNS boolean AS
$BODY$DECLARE success boolean;
BEGIN
EXECUTE 'CREATE USER ' || quote_ident($1) || ' PASSWORD ' || quote_literal($2);
EXECUTE 'GRANT systemusers TO ' || quote_ident($1);
SELECT pg_roles.rolname = $1 INTO success FROM pg_roles WHERE pg_roles.rolname = $1;
RETURN success;
END$BODY$
  LANGUAGE plpgsql VOLATILE SECURITY DEFINER
  COST 100;
ALTER FUNCTION "SP_CreateUser"(character varying, character varying)
  OWNER TO administrators;
GRANT EXECUTE ON FUNCTION "SP_CreateUser"(character varying, character varying) TO administrators;
GRANT EXECUTE ON FUNCTION "SP_CreateUser"(character varying, character varying) TO systemusers;
REVOKE ALL ON FUNCTION "SP_CreateUser"(character varying, character varying) FROM public;
CREATE OR REPLACE FUNCTION website."SP_CreateProfile"("EmailAddress" character varying, "FirstName" character varying, "LastName" character varying, "PhoneNumber" character varying)
  RETURNS boolean AS
$BODY$DECLARE success boolean;
BEGIN
INSERT INTO website.profiles ("UserEmail", "FirstName", "LastName", "AdministrativeUser", "Active", "PhoneNumber")
VALUES ($1, $2, $3, FALSE, TRUE, $4);
SELECT p."UserEmail" = $1 INTO success FROM website.profiles p WHERE p."UserEmail" = $1;
RETURN success;
END$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION website."SP_CreateProfile"(character varying, character, character varying, character varying, character varying, character varying)
  OWNER TO administrators;
GRANT EXECUTE ON FUNCTION website."SP_CreateProfile"(character varying, character, character varying, character varying, character varying, character varying) TO administrators;
GRANT EXECUTE ON FUNCTION website."SP_CreateProfile"(character varying, character, character varying, character varying, character varying, character varying) TO systemusers;
REVOKE ALL ON FUNCTION website."SP_CreateProfile"(character varying, character, character varying, character varying, character varying, character varying) FROM public;