我正在开发一个应用程序来向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();
}
答案 0 :(得分:0)
ALTER USER user1 WITH SUPERUSER;
使您的用户成为拥有所有权限的超级用户。但是,您仍然可以单独分配其他一些权限,例如CREATEUSER
,CREATEROLE
,LOGIN
等。请按照此处的官方文档:
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