迁移时我需要禁用表的触发器和约束/外键关系。我正在使用 Flyway 进行迁移。
因此,我想创建一个除超级用户之外的不同用户,并让新用户能够禁用/启用给定模式的所有触发器/约束。
所以我尝试了这个:
CREATE USER "MY_USER" WITH PASSWORD 'password';
GRANT ALL PRIVILEGES ON DATABASE postgres to "MY_USER";
create schema "MY_SCHEMA";
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA "MY_SCHEMA" TO "MY_USER";
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA "MY_SCHEMA" TO "MY_USER";
GRANT ALL PRIVILEGES ON SCHEMA "MY_SCHEMA" TO "MY_USER";
Run Code Online (Sandbox Code Playgroud)
但是当我使用 MY_USER 并尝试运行此脚本时:
ALTER TABLE "MY_SCHEMA".TBLTABLE
DISABLE TRIGGER ALL;
Run Code Online (Sandbox Code Playgroud)
我收到错误:权限被拒绝:“RI_ConstraintTrigger_c_16434”是系统触发器。
当我使用超级用户尝试此脚本时,我可以运行它,但无法使用我创建的用户运行它。有什么建议么?
我的理解new ArrayList<String>()
是将其转换为原始类型,并且使用大量的语法糖来假装Object的这个ArrayList就像String的ArrayList.Java将此称为类型擦除.
这是我用Java写的:
public static void main(String[] args) {
ArrayList<String> stringList = new ArrayList<>();
stringList.add("foo");
String s = stringList.get(0);
}
Run Code Online (Sandbox Code Playgroud)
当我反编译字节码时,我得到了这个:
public static void main(String[] args) {
ArrayList<String> stringList = new ArrayList();
stringList.add("foo");
String s = (String)stringList.get(0);
}
Run Code Online (Sandbox Code Playgroud)
为什么无法使用编译器为类型擦除提取的"shtick" 自动new T[]
转换为(T[]) new Object[]
自动转换?
请不要将我引用到这个问题:我无法在Java中创建通用数组类型的原因是什么?特别是这个评论:
问题比答案更深刻,因此需要进一步调查.如你所说的类型信息被删除,在编译代码中我们没有两个泛型类型之间的区别 - 我们只有基类型 - 所以为什么
T[]
- 编译到Object[]
.在这种情况下,一切都会很好 - 数组将记住它是使用对象类型创建的,并将保存所有类型.然而,对我来说,真正的问题是数组是协变的意味着Animal[]
可以分配给Object[]
.另一方面,泛型不是ArrayList<Animal>
不能分配的ArrayList<Object>
因为这个逻辑是有缺陷的!
这里有两个进程.
编译器强制执行"人为" …
既然and
C# 9 中存在关键字,我and
应该什么时候使用,&&
什么时候应该使用?