其他约束详细信息¶
本主题内容:
约束的安全权限¶
要创建主键或唯一约束:
更改现有表以添加约束时,用户的当前角色必须对该表拥有 OWNERSHIP 权限。
创建新表时,用户的当前角色必须对将要创建表的架构拥有 CREATE TABLE 权限。
要创建外键约束:
用户的当前角色必须拥有外键表的 OWNERSHIP 特权。
用户的当前角色必须对唯一/主键表拥有 REFERENCES 权限。
可以使用 GRANT <privileges> 和 REVOKE <privileges> 命令授予角色和撤销角色的 REFERENCES 权限:
GRANT REFERENCES ON TABLE <pk_table_name> TO ROLE <role_name> REVOKE REFERENCES ON TABLE <pk_table_name> FROM ROLE <role_name>
对复制命令中约束的支持¶
Snowflake 支持使用 CREATE TABLE 创建表的副本:
要创建空副本,请使用 CREATE TABLE ...LIKE。
要创建克隆,请使用 CREATE TABLE ...CLONE。
此外,克隆架构或数据库时会自动创建表的副本。
无论以何种方式为表创建副本,都会复制原始表上的约束。使用引用表(外键表)和被引用表(主键表)复制外键时,可能会出现以下情况:
如果在同一命令中复制两个表(例如在克隆架构或数据库期间),则会在新的引用表和被引用表之间创建一个新的外键。
如果仅复制引用表,则会在引用表上创建一个新的外键,该外键指向作为引用表的原始主键表。
如果仅复制被引用表,则不会创建新的外键,尽管会复制主键/唯一键。
因此,如果用户分别复制引用表和被引用表,则必须手动创建新的外键,或手动更改新外键的主键表。
对 GET_DDL 中约束的支持¶
Snowflake 支持对 GET_DDL 的约束;但是,请注意以下几点:
仅单列约束(如
NOT NULL
和DEFAULT
)是根据列的定义重新构造的内联。表约束(如唯一键/主键/外键)始终被重新构造为外联约束,即使它们由单个列组成也是如此。
对于未命名的约束(即具有系统生成名称的约束),GET_DDL 不会返回系统生成的名称。
约束的注释¶
与其他数据库对象和构造类似,Snowflake 支持为约束提供注释。可以通过两种方式将注释添加到约束中:
外联约束支持 COMMENT 子句,在定义约束时可以指定注释。
定义内联约束时不允许使用注释,因为注释可能会导致歧义。
也可以使用 COMMENT 命令对约束设置注释: