2

除了在 INSERT/UPDATE 期间忽略查询给定值以支持默认值的触发器之外,还有其他实用方法吗?

这是我要存档的行为:

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 |
+----+------+

谢谢!

4

3 回答 3

1

并不真地。触发器是去这里的方式。

好吧,您也可以使用条件规则。但我不会。
使用检查约束,您只能限制您不想要的值或其组合,但这会引发异常并完全跳过操作。

于 2011-10-17T19:11:46.747 回答
1

你真的不应该这样做。

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

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

  • 使用检查 if 的 after insert 触发器和检查 if并在检查失败时引发错误 NEW.id=curval('foo_id_seq')的 after update 触发器,但是您出于某种奇怪的原因排除了触发器;NEW.id=OLD.id
  • 禁用超级用户以外的用户对该表的写访问权并创建用于插入数据的函数:
    创建函数 insert_to_foo(text) 返回 void 作为
    $$ 插入 foo(data) 值 ($1); $$
    语言 sql volatile 安全定义器
    设置 search_path = public,pg_temp;
于 2011-10-18T09:03:59.097 回答
0

如果有帮助,有一种方法可以拒绝用户发送的某些列。如下,

revoke insert, update on table foo from public;
grant insert (data), update (data) on table foo to public;

如图所示,第一个revoke必须在整个桌子上。如果您只是尝试revoke insert (id) .....,它将被现有的更全面的赠款所取代。因此,它需要这两个指示的步骤。

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

于 2019-07-07T19:38:10.157 回答