postgresql用户无法使用主键写入表

时间:2016-11-04 02:05:00

标签: c# sql postgresql

我正在开发一个应用程序来向PostgresSql(C#+ Npgsql)写入和读取数据。有一个名为"格式"有2列:format_id(serial,pk),format(text,not null)。 我使用的SQL命令:

INSERT INTO formats (format) VALUES ('some value')

(我没有指定主键,因为db应该生成它)。

有一个名为user1的用户。我在格式上向user1授予了SELECT,UPDATE,INSERT。当我使用管理员的凭据(postgres + pass)时,应用程序工作正常,当我使用user1 +密码时,它不会插入任何数据,也不会显示错误消息。尽管这个user1 +密码在没有主键作为序列的其他测试表上工作正常。

尝试了许多事情,包括表格的删除和重新创建,用户1,调试等等。任何想法可能出错?有特权吗?

提前致谢。

编辑:这是我的方法:

public void WriteInto2FieldTable (string tblName, List<Tuple<string, string>> fieldValuePair)
    {
        CreateConnection();

        using (connection)
        {
            //do staff here
            connection.Open();

            using (var command = new NpgsqlCommand())
            {
                command.Connection = connection;
                //string value;
                //string field;

                foreach (Tuple<string, string> fvp in fieldValuePair)
                {
                    // Insert data
                    //command.CommandText = string.Format("INSERT INTO {0} (format_id, {1}) VALUES (nextval('formats_format_id_seq'),'{2}')", tblName, fvp.Item1, fvp.Item2);
                    command.CommandText = string.Format("INSERT INTO {0} ({1}) VALUES ('{2}')", tblName, fvp.Item1, fvp.Item2);

                    try
                    {
                        command.ExecuteNonQuery();
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }

            }
        }

        //Remove FiledValuePairs from list

        fieldValuePair.Clear();
    }

3 个答案:

答案 0 :(得分:0)

ALTER USER user1 WITH SUPERUSER;使您的用户成为拥有所有权限的超级用户。但是,您仍然可以单独分配其他一些权限,例如CREATEUSERCREATEROLELOGIN等。请按照此处的官方文档: https://www.postgresql.org/docs/9.5/static/sql-alteruser.html

您必须首先使用特权用户登录才能将这些权限授予次要用户,默认情况下为postgres

<强>更新 好吧,如果所有权限都没有问题,为了跳过在插入查询中提及id字段,请尝试将id字段的数据类型更改为SERIAL。之后,可能是您的初始查询INSERT INTO formats (format) VALUES ('some value');将起作用。

答案 1 :(得分:0)

对于Postgres或NpgSql,主键完全无关紧要,特别是在插入时。

这些是猜测,但有两个想法:

可能是admin id的默认架构与user1的默认架构不同。明确声明架构:

insert into <schema>.formats (format) values ('foo')

这实际上是在黑暗中拍摄,但如果不起作用,请手动调用序列:

insert into <schema>.formats (format_id, format) values
(nextval('formats_format_id_seq'), 'foo')

此外,当您在C#中运行ExecuteNonQuery()时,它会返回什么? “1”意味着它是成功的,0意味着它成功无所作为。你有尝试/捕获,它是否成功通过?

答案 2 :(得分:0)

我想我找到了答案。我需要 授予使用权,选择SCHEMA public TO user1;

中的所有序列

GRANT USAGE - 对于序列,此权限允许使用currval和nextval函数。

来源:ERROR: permission denied for sequence cities_id_seq using Postgres