转:PostgreSQL角色、用户、权限和数据库安全

PostgreSQL实现了基于角色的存取控制机制。角色是权限的集合。可以将权限赋给用户,也可以将权限赋给角色。可以将角色赋给一个用户,该用户将拥有角色的所有权限。也可以将角色赋给其它的角色。PostgreSQL中的用户和角色使用同一个名字空间。数据库中不能有两个用户同名,不能有两个角色同名,也不能有一个用户和一个角色同名。


数据库中存在一个内置的超级用户postgres,postgres可以在数据库中创建新的超级用户,也可以把一个超级用户变成普通用户。同时数据库中也有一个内置的名为PUBLIC的角色, 任何用户都可以给PUBLIC授权和回收权限。数据库中的所有用户和角色都自动拥有PUBLIC角色拥有的一切权限。

2.1 数据库权限

PostgreSQL中的权限分为系统权限和对象权限。系统权限只能赋给用户,不能赋给角色。对象权限既能赋给用户,又能赋给角色。 系统权限有以下三种:


权限名称


权限功能

CREATEDB


创建数据库

CREATEROLE


创建、删除和修改角色或用户


对象权限与具体的数据库对象有关,不同的数据库对象有不同的权限。 PostgreSQL中的对象表(table)、序列(sequnce)、数据库(database)、函数(function)、语言(languange)、模式(schema)和表空间(tablespace)都有自己的权限类型。


(1)表权限如下表



权限名称


权限功能

SELECT


查询表

INSERT


表中插入新记录

UPDATE


更新表

DELETE


删除表中的记录

REFERENCES


可以在表中创建外键约束, 必须在被外键引用的表上同时有该权限才能创建外键约束

TRIGGER


可以在表上创建触发器





(2)序列权限如下表



权限名称


权限功能

SELECT


对序列使用currval函数

USAGE


对序列使用currval 函数和nextval函数

UPDATE


对序列使用nextval 函数和setval函数





(3)数据库权限如下表



权限名称


权限功能

CONNECT


可以连接数据库

TEMPORAR


可以在数据库中创建临时表

TEMP


同上,可以在数据库中创建临时表

CREATE


可以在数据库中创建新的模式



PUBLIC角色自动拥有新建的数据库上的CONNECT权限。



(4)函数权限如下表



权限名称


权限功能

EXECUTE


可以调用函数,也可以使用任何在该函数基础上实现的运算符





(5)语言权限如下表



权限名称


权限功能

USAGE


可以使用该语言创建函数





(6)模式权限如下表



权限名称


权限功能

CREATE


在模式里面创建新的数据库对象,如果要重命令模式里面的一个数据库对象,执行命令的用户必须对该模式有CREATE权限,同时必须是并重命名的对象的所有者。

USAGE


允许访问模式里面的数据库对象





(7)表空间权限如下



权限名称


权限功能

CREATE


在表空间里面创建表、临时表和索引,新创建的数据库可以将该表空间作为它的默认表空间。 如果该权限被回收,在该表空间中被创建的数据库对象仍然被存放在该表空间中。








2.2 数据库用户和角色


2.2.1创建数据库用户



使用下面的命令来创建数据库用户:

CREATE USER  name  [ [ WITH ]  option [ ... ] ]  [ WITH ] { ENCRYPTED | UNENCRYPTED } PASSWORD ‘password’[ [ WITH ]  option [ ... ] ]



Option可以是:

SUPERUSER | NOSUPERUSER

| CREATEDB | NOCREATEDB

| CREATEROLE | NOCREATEROLE

| CONNECTION LIMIT connlimit

| VALID UNTIL ’timestamp’





执行该命令的用户必须具有CREATEROLE权限或者是超级用户,其中WITH关键字可以省略。

SUPERUSER表示新创建的用户是超级用户,NOSUPERUSER表示新创建的用户不是超级用户,默认是NOSUPERUSER,只有postgres才能创建超级用户。

CREATEDB表示新创建的用户有CREATEDB权限,NOCREATEDB表示新创建的用户没有CREATEDB权限,默认是NOCREATEDB。

CREATEROLE表示新新创建的用户有CREATEROLE权限,NOCREATEROLE表示新创建的用户没有CREATEROLE权限,默认是NOCREATEROLE。



CONNECTION LIMIT connlimit 设定该用户能在数据库中建立的并发连接的上限,默认是没有上限。

{ ENCRYPTED | UNENCRYPTED } PASSWORD ‘password’设定用户的密码,指明ENCRYPTED,则用户的密码用加密的方式(MD5方法加密)存在数据库中,指明UNENCRYPTED则用户的密码用明文的方式存在数据库中。

VALID UNTIL ‘timestamp’ 指定密码的过期时间,timestamp格式是”年-月-日”,例如” 2010-09-23”,默认是永不过期。



下面是一些实际的例子: 

(1) CREATE USER  li_ming  WITH  PASSWORD ‘jw8s0F4’  CREATEDB CREATEROLE CONNECTION LIMIT 100 LOGIN; 

该命令创建一个名为li_ming的数据库用户,它不是超级用户,它的密码是jw8s0F4, 密码是用加密方式存放在数据库中,它具有CREATEDB、 CREATEROLE 和LOGIN权限, 它在数据库中建立的并发连接数目不能超过100。



(2) CREATE USER  li_zhe  WITH  PASSWORD ‘hjkkoi’   SUPERUSER  VALID UNTIL ‘2010-09-09’;

该命令创建一个名为li_zhe的数据库用户,它是超级用户,它的密码是hjkkoi, 密码是用加密方式存放在数据库中,它在数据库中建立的并发连接数目没有上限,它的密码将在2010年09月09日过期。




2.2.2 修改数据库用户的属性



使用下面的命令来修改数据库用户的属性:

ALTER USER name [ [ WITH ] option [ ... ] ]

其中option可以是:

SUPERUSER | NOSUPERUSER

| CREATEDB | NOCREATEDB

| CREATEROLE | NOCREATEROLE

| CONNECTION LIMIT connlimit

| { ENCRYPTED | UNENCRYPTED } PASSWORD ’password’

| VALID UNTIL ’timestamp’



具有CREATEROLE权限的用户或者超级用户才能执行该命令,option选项的含义参见CREATE USER命令。数据库超级用户可以修改任何普通用户的属性。只用postgres才能修改其它的超级用户的属性。一个用户只能修改自己的密码,不能修改自己的其它属性。



下面是一些实际的例子:

(1)ALTER USER  li_ming  NOCREATEDB  NOCREATEROLE  NOLOGIN;

这条命令将使数据库用户li_ming失去CREATEDB、CREATEROLE和LOGIN权限。



(2)ALTER  USER  li_ming  password ‘hjkop3’;

这条命令将数据库用户li_ming的密码改为hjkop3。




2.2.3 删除用户 



使用下面的命令来删除数据库用户:

DROP USER [ IF EXISTS ] name [, ...]



DROP USER命令删除一个数据库用户。执行命令的用户必须有具有CREATEROLE 权限或者是超级用户。如果被删除的用户是超级用户,执行命令的用户必须是postgres。一个用户被删除以后,该用户拥有的所有数据库对象都会被自动删除,所有依赖于该用户拥有的数据库对象的数据库对象也会被自动删除。下面是一个例子:

(1)DROP USER user1;

删除用户user1。


2.2.4 创建角色

使用下面的命令来创建数据库角色:

CREATE ROLE name



具有CREATEROLE权限的用户才能执行该命令。下面是一个例子:

(1)CREATE ROLE role1;

这条命令在数据库中创建一个名为role1的角色。


2.2.5 删除角色

使用下面的命令来删除数据库角色:

DROP ROLE [ IF EXISTS ] name [, ...]



具有CREATEROLE权限的用户才能执行该命令。下面是一个例子:

(1)DROP ROLE role1;

删除角色role1。


2.2.6 给角色或用户授予对象权限



可以使用下面的命令来给角色或用户授予对象权限:

(1)GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER }

[,...] | ALL [ PRIVILEGES ] }

ON [ TABLE ] tablename [, ...]

TO {  rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]



(2)GRANT { { USAGE | SELECT | UPDATE } [,...] | ALL [ PRIVILEGES ] }

ON SEQUENCE sequencename [, ...]

TO {  role_or_user_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]



(3)GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }

ON DATABASE dbname [, ...]

TO {  role_or_user_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]



(4)GRANT { EXECUTE | ALL [ PRIVILEGES ] }

ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...]

TO {  role_or_user_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]



(5)GRANT { USAGE | ALL [ PRIVILEGES ] }

ON LANGUAGE langname [, ...]

TO {  role_or_user_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]



(6)GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }

ON SCHEMA schemaname [, ...]

TO {  role_or_user_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]



(7)GRANT { CREATE | ALL [ PRIVILEGES ] }

ON TABLESPACE tablespacename [, ...]

TO {  role_or_user_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]



执行该命令的用户必须满足下面的条件中的一个:

(1)是超级用户。

(2)是数据库对象的所有者。

(3)对权限有GRANT OPTION, 必须是直接拥有,从拥有的角色那里得到的GRANT OPTION是无效的。



USAGE、SELECT、UPDATE、CREATE和EXECUTE的含义已经在上面解释过。 ALL PRIVILEGES或者ALL表示该数据库对象上的所有权限。PUBLIC表示将权限赋给数据库中的所有角色和用户,即使是以后新建立的用户和角色也会自动拥有这些权限。GRANT OPTION 表示接收权限

的用户可以将该权限再赋给其它用户和角色, PUBLIC和GRANT OPTION不能同时使用。





下面是一些具体的例子:

(1)GRANT SELECT on  salary  to user1, role1;

这条命令将表salary上的SELECT权限赋给用户user1和角色role1。



(2)GRANT SELECT on  salary, UPDATE on salary to role1 ;

这条命令将表salary上的SELECT和UPDATE权限赋给角色role1。



(3)GRANT ALL PRIVILEGES on  salary  to role1 ;

这条命令将表salary上的所有权限赋给角色role1。



(4)GRANT USAGE  on  SEQUENCE id_counter to role1 ;

这条命令将序列id_counter上的USAGE权限赋给角色role1。



(5)GRANT USAGE  on  SEQUENCE id_counter to PUBLIC;

这条命令将序列id_counter上的USAGE权限赋给数据库中的所有角色和用户。



(6)GRANT USAGE  on  SEQUENCE id_counter to user1,role1 WITH GRANT OPTION;

这条命令将序列id_counter上的USAGE权限赋给角色或用户user1和角色role1。用户user1可以将该权限再赋给其它用户或角色。




2.2.7 从角色或用户手中回收对象权限



使用下面的命令来从角色或用户手中回收对象权限:

(1)REVOKE [ GRANT OPTION FOR ]

{ { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER }

[,...] | ALL [ PRIVILEGES ] }

ON [ TABLE ] tablename [, ...]

FROM {  role_or_user_name | PUBLIC } [, ...]

[ CASCADE | RESTRICT ]



(2)REVOKE [ GRANT OPTION FOR ]

{ { USAGE | SELECT | UPDATE }

[,...] | ALL [ PRIVILEGES ] }

ON SEQUENCE sequencename [, ...]

FROM { [  role_or_user_name | PUBLIC } [, ...]

[ CASCADE | RESTRICT ]



(3)REVOKE [ GRANT OPTION FOR ]

{ { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }

ON DATABASE dbname [, ...]

FROM { role_or_user_name | PUBLIC } [, ...]

[ CASCADE | RESTRICT ]



(4)REVOKE [ GRANT OPTION FOR ]

{ EXECUTE | ALL [ PRIVILEGES ] }

ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...]

FROM {  role_or_user_name | PUBLIC } [, ...]

[ CASCADE | RESTRICT ]



(5)REVOKE [ GRANT OPTION FOR ]

{ USAGE | ALL [ PRIVILEGES ] }

ON LANGUAGE langname [, ...]

FROM { role_or_user_name | PUBLIC } [, ...]

[ CASCADE | RESTRICT ]



(6)REVOKE [ GRANT OPTION FOR ]

{ { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }

ON SCHEMA schemaname [, ...]

FROM { role_or_user_name | PUBLIC } [, ...]

[ CASCADE | RESTRICT ]



(7)REVOKE [ GRANT OPTION FOR ]

{ CREATE | ALL [ PRIVILEGES ] }

ON TABLESPACE tablespacename [, ...]

FROM {  role_or_user_name | PUBLIC } [, ...]

[ CASCADE | RESTRICT ]



执行该命令的用户必须曾经向被回收权限的用户或角色授予过被回收的权限。如果执行该命令的用户没有向被回收权限的用户或角色授予过被回收的权限,但该用户是超级用户,或者是权限引用的数据库对象的所有者,或者拥有被回收的权限和该权限的GRANT OPTION,数据库不会报错,被回收权限的用户或角色仍然拥有被回收的权限。

PUBLIC表示从从PUBLIC角色手中回收权限。GRANT OPTION FOR表示只回收权限的GRANT OPTION,不回收权限。REVOKE ALL PRIVILEGES 表示回收指定的数据库对象上的所有权限。CASCADE表示如果被回收权限的用户或角色将该权限又赋给了其它用户和角色,该权限也会从这些用户和角色手中被回收掉。RESTICT的含义与CASCADE相反,表示如果被回收权限的用户或角色将该权限又赋给了其它用户和角色,该权限不会从这些用户和角色手中被回收掉。如果CASCADE 和 RESTRICT 都没有指定,默认是RESTRICT。



下面是一些具体的例子:

(1)REVOKE SELECT on  salary  from PUBLIC, role1;

这条命令将表salary上的SELECT权限从角色PUBLIC,角色role1手中回收掉。



(2)REVOKE  GRANT OPTION FOR  SELECT on  salary  from  user1;

这条命令将salary上的SELECT权限的GRANT OPTION从用户user1手中回收掉, user1仍然拥有SELECT权限,但他不能将该权限再赋给其它用户或角色。



(3)REVOKE  SELECT on  salary  from  user1 CASCADE;

这条命令将表salary上的SELECT权限从用户user1手中回收掉,如果user1将该权限赋给了其它用户或角色,这些用户或角色也会失去该权限。




2.2.7 将角色赋给角色和用户



使用下面的命令将角色赋给角色和用户:

GRANT role_name [, ...] TO role_or_user_name [, ...]



执行该命令的用户应该满足下面的两个条件中的一个:

(1)具有CREATEROLE权限。

(2)是超级用户。



下面是一些具体的例子:

(1)GRANT role1 to role2, user1;

这条命令将角色role1赋给角色role2和用户user1。



(2)GRANT role1 to role2, user1 WITH ADMIN OPTION;

这条命令将角色role1赋给角色role2和用户user1,role2的用户成员可以将role1赋给其它用户或角色,user1也可以将role1赋给其它用户或角色。




2.2.8 从角色和用户手中回收角色



使用下面的命令从角色和用户手中回收角色:

REVOKE role [, ...] FROM role_or_user_name [,...]



执行该命令的用户应该满足下的两个条件中的一个:

(1)具有CREATEROLE权限。

(2)是超级用户。





注意: 如果多个不同的用户将同一权限obj_priv赋给了同一个用户或角色role1,如果有一个授权者从role1手中回收权限obj_priv,那么role1仍然拥有权限obj_priv。只有所有的授权者对role1执行了回收权限obj_priv的操作, 而且role1拥有的所有角色都不拥有权限obj_priv,role1才会真正地失去权限obj_priv。



下面是一个例子:

(1)RERVOKE role1 from role2, user1

这条命令从角色role2, 用户user1手中回收角色role1, role2和user1将失去从role2得来的权限

转载于:https://www.cnblogs.com/loveyue/archive/2011/06/04/2072531.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iNeuOS工业互联平台,发布消息管理、子用户权限管理、元件移动事件、联动控制、油表饼状图和建筑类设备驱动,v3.4版本...

目 录1. 概述... 22. 平台演示... 23. 消息管理... 24. 子用户权限管理... 35. 元件移动事件... 36. 联动控制... 47. 增加油表和饼图... 58. 增加住建部DL/T645和智能液位计协议驱动1. 概述发布iNeuOS 3.4版本,主…

程序猿看段子,越看越心碎!

程序员整天面对代码,压力一定很大吧~小编表示应该时不时也给你们来点段子,增加一下生活的乐趣,让你们看到希望的曙光...今天整理的10个段子,你们绝对喜欢。看看就知道啦!【一直有人问我,程序员应该看什么书…

mysql写入监控_zabbix 自定义key 监控mysql增删查改

vim /etc/zabbix/zabbix_agentd.d/mysql.conf##zabbix_agentd.d在这个文件夹下的.conf,都会被agent读取,我们这里新建的一个配置文件方便使用,这样就不需要去动主配置文件了UserParameterecho[*],echo "$1"#要传递参数要带[*],且ke…

自制H3C交换机CONSOLE线

单位有一台H3C S3600交换机,手痒痒的想进入玩一下。 从网上查得,连接CONSOLE接口用的是串口,只不过用RJ45水晶头插入而已。 山高路远,囊中羞涩,刚好手头上有一个文曲星的连接线,串口的。 凭自己半桶水的电子…

5月份Github上最热门的数据科学和机器学习项目

GitHub最近以数十亿美元的交易被微软收购。GitHub一直是开发人员之间协作的终极平台,我们已经看到数据科学和机器学习社区同样非常需要它,因此,我们希望GitHub能在微软的保护下继续发展下去。在本月排行中,上榜的项目有英特尔开源…

Blazor 中如何下载文件到浏览器

Blazor 中如何下载文件到浏览器目录一、前言二、方法一(导航跳转)三、方法二(下载后传出)(一) 使用 RestSharp 下载(二) 使用 BlazorDownloadFile 传出独立观察员 2021 年 3 月 28 日一、前言最近想给之前文章《下载中转加速器 VP…

.NET 异步,你也许不知道的5种用法

async/await异步操作,是C#中非常惊艳的“语法糖”,让异步编程变得优美且傻瓜化到了不可思议的程度。就连JavaScript都借鉴了async/await语法,让回调泛滥的JavaScript代码变得很优美。我之前录制的.NET视频教程已经把async/await等基础知识介绍…

兼容FF,IE的纯CSS下拉菜单

代码简介&#xff1a;作者的CSS水平不错啊&#xff0c;值得我们学习&#xff0c;少了JS&#xff0c;就是好看多。 代码内容&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transiti…

荐书 | 5本数学科普让你不再“畏惧”数学,感受数学的内在美

最近&#xff0c;小木了解了许多关于数学的书籍&#xff0c;简直打开了小木数学新世界的大门。出版社寄了一些样书给小木&#xff0c;经过斟酌对比之后&#xff0c;推荐以下5本数学科普书给大家。01《数学简史》[中] 蔡天新 43.50提到数学&#xff0c;很多人的第一反应就是复杂…

操作系统hpf算法事例_操作系统调度算法是什么

操作系统调度算法是什么导读&#xff1a;小编根据大家的需要整理了一份关于《操作系统调度算法是什么》的内容&#xff0c;具体内容&#xff1a;学习操作系统的朋友们肯定遇到过调度算法&#xff0c;目的是控制资源使用者的数量,选取资源使用者许可占用资源或占用资源&#xff…

ASP.NET Core依赖注入初识与思考

一、前言在上一篇中&#xff0c;我们讲述了什么是控制反转(IoC)以及通过哪些方式实现的。这其中&#xff0c;我们明白了&#xff0c;「控制反转&#xff08;IoC&#xff09;」 是一种软件设计的模式&#xff0c;指导我们设计出更优良&#xff0c;更具有松耦合的程序&#xff0c…

memcached mysql缓存_memcached做数据库缓存

最近研究memcache小有成果&#xff0c;把经验分享出来。白话:很早就听说memcache了&#xff0c;一直没搞懂&#xff0c;后来又看到redis很火&#xff0c;可以用来做缓存&#xff0c;研究了半天也没搞懂咋个做缓存&#xff0c;后来也不纠结了&#xff0c;继续学习python,当对pyt…

掌握Python爬虫基础,仅需1小时!

随着互联网的发展&#xff0c;google、百度等搜索引擎让我们获取信息愈加方便。但需求总会不断涌现&#xff0c;纯粹地借助百度等收集信息是远远不够的&#xff0c;因此编写爬虫爬取信息的重要性就越发凸显。比如有人为了炒股&#xff0c;专门爬取了多种股票信息&#xff1b;也…

我看ITIL在中国(六):如何建立有中国特色的IT运维管理平台【二】

在开始筹划建设有“中国特色的IT运维管理平台”之前&#xff0c;先来看看我们目前面临的情况&#xff1a; 随着信息化建设的不断深入&#xff0c;各种企业的核心业务都逐步地迁移到IT平台上来&#xff0c;对IT管理的要求也越来越高&#xff0c;IT需要管理&#xff0c;向IT管理要…

史上首次!世界杯使用视频裁判

2018年6月16日18时&#xff0c;法国队在喀山中央球场迎来了他们本届世界杯的首场比赛&#xff0c;对手是澳大利亚队。比赛进行到第56分钟&#xff0c;格列兹曼接到队友的直塞球&#xff0c;单刀杀入禁区&#xff0c;澳大利亚后卫里斯登铲球&#xff0c;但并没有碰到皮球&#x…

mysql 5.6.37 winx64_Mysql 5.6.37 winx64安装双版本mysql笔记记录

机器上现在已经存在5.0版本Mysql的情况下&#xff0c;继续安装一个最新版的mysql.一、官网下载免安装压缩包。本人下载的是mysql-5.6.37-winx64.zip.将压缩包解压到自定义目录中。例如:D:\mysql-5.6.37.二、添加环境变量.右键单击我的电脑->属性->高级系统设置(高级)->…

二分查找和折半插入排序一块说说-很合适~~~

前言上一篇在聊时间复杂度和空间复杂度时&#xff0c;没有按指定格式显示(明明预览的时候没问题的)&#xff0c;强迫症的我稍微优化了一下重新发布&#xff0c;目的就是让小伙伴看着舒服。上次聊到的直接插入排序在比较有序数据和待插入数据时&#xff0c;是通过依次遍历的方式…

用Python更加了解微信好友

用了微信几年了&#xff0c;微信号有也不少了&#xff0c;但是真正了解自己的好友吗&#xff1f;好友最多的城市是哪个&#xff1f;好友男女比例是多少&#xff1f;好友签名都是什么&#xff1f;今天我们来充分了解自己的微信好友。运行平台&#xff1a; Windows Python版本&a…

Linux下配置DNS

Linux下配置DNS一、配置环境1.Linux操作系统版本&#xff1a;RedHat AS 52.网络环境设置&#xff1a;IP&#xff1a;192.168.1.1 NetMark&#xff1a;255.255.255.0 Getway&#xff1a;192.168.1.13.软件包的准备&#xff1a;1&#xff09;bind-9.3.3-7.el5.i386.rpm …

python用pandas提取行列_python- pandas 不删除符合条件的行和列

我正在尝试建立一个回归模型,以便根据出现的单词来预测收视率(1-5)(回归本身并不一定表现良好,更多的是关于所采用的方法).我使用以下代码创建了一个词频矩阵&#xff1a;bow df.Review2.str.split().apply(pd.Series.value_counts)看起来像这样&#xff1a;我现在有兴趣删除在…