Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何强制PostgreSQL中列的默认值?_Postgresql_Default Value_Database Trigger - Fatal编程技术网

如何强制PostgreSQL中列的默认值?

如何强制PostgreSQL中列的默认值?,postgresql,default-value,database-trigger,Postgresql,Default Value,Database Trigger,在插入/更新过程中,除了触发器之外,是否有任何实用的方法可以忽略查询给定值而代之以默认值 这是我想要存档的行为: CREATE TABLE foo (id serial, data text); INSERT INTO foo (data) VALUES('bar1'); INSERT INTO foo (id, data) VALUES(50, 'bar2'); INSERT INTO foo (id, data) VALUES(-34, 'bar3'); INSERT INTO foo (

在插入/更新过程中,除了触发器之外,是否有任何实用的方法可以忽略查询给定值而代之以默认值

这是我想要存档的行为:

CREATE TABLE foo (id serial, data text);

INSERT INTO foo (data) VALUES('bar1');
INSERT INTO foo (id, data) VALUES(50, 'bar2');
INSERT INTO foo (id, data) VALUES(-34, 'bar3');
INSERT INTO foo (id, data) VALUES(80.34, 'bar4');
INSERT INTO foo (id, data) VALUES('foo5', 'bar5');
INSERT INTO foo (data) VALUES('bar6');

UPDATE foo SET id=200, data='BARn' WHERE íd=6;

SELECT * FROM foo;

+----+------+
| id | data |
+----+------+
|  1 | bar1 |
|  2 | bar2 |
|  3 | bar3 |
|  4 | bar4 |
|  5 | bar5 |
|  6 | BARn |
+----+------+

谢谢

不太可能。扳机才是解决问题的方法

好吧,你也可以用条件句。但我不会的。

使用时,您只能限制不需要的值或其组合,但这会引发异常并完全跳过该操作。

您确实不应该这样做

您应该以这样的方式编程,使您的代码不会表现出奇怪的行为。向数据库中插入某些内容后,应插入此数据或引发错误

您可以通过以下方式强制执行
serial
始终保持一致:

  • 使用一个检查是否
    NEW.id=curval('foo_id_seq')
    的后插入触发器和一个检查是否
    NEW.id=OLD.id
    的后更新触发器,如果该检查失败,则引发一个错误,但您出于某种奇怪的原因排除了触发器;
  • 禁用超级用户以外的用户对此表的写入访问并创建用于插入数据的函数: create function insert_to_foo(text) returns void as $$ insert into foo(data) values ($1); $$ language sql volatile security definer set search_path = public, pg_temp; 创建函数insert_to_foo(文本)返回void作为 $$插入foo(数据)值($1)$$ 语言sql易失性安全定义程序 设置搜索路径=公共,pg_temp;
如果有帮助,可以拒绝用户发送的某些列。如下:

revoke insert, update on table foo from public;
grant insert (data), update (data) on table foo to public;
如图所示,第一个
revoke
必须位于整个表上。如果您只是尝试
revoke insert(id)…
,它将被表中现有的更全面的授权所取代。因此,它采取了这两个指示步骤


请记住,发送禁止的列将导致错误。

为了让其他读者觉得这个答案很有用,函数名为
currval
,而不是
curval