赞
踩
DCL( Data Control Language,数据控制语言)用于对数据访问权限进行控制,定义数据库、表、字段、用户的访问权限和安全级别。主要关键字包括 GRANT、 REVOKE 等。
DCL( Data Control Language,数据控制语言)用于对数据访问权限进行控制,定义数据库、表、字段、用户的访问权限和安全级别。主要关键字包括 GRANT、 REVOKE 等。
MySQL 的 mysql
系统库提供了 user
、db
、tables_priv
、columns_priv
、procs_priv
、proxies_priv
几个表,用于存放不同权限范围的用户账号相关数据,这些表共同组成了 MySQL 的访问权限控制系统。
MySQL 访问权限控制系统的主要功能是对从给定主机连接到 MySQL 服务器的用户进行身份验证,并校验该用户在该服务器中的数据库对象访问权限(如 SELECT
、INSERT
、UPDATE
和 DELETE
)。另外,还包括管理匿名用户访问和授予特定的 MySQL 权限的功能(如执行 LOAD DATA INFILE
语句和管理操作权限等)。
MySQL 访问权限控制系统的用户界面由几条 SQL 语句组成,如 CREATE USER
、GRANT
和 REVOKE
。
在服务器内部,MySQL 将权限信息存储在 mysql
系统库的权限表中。MySQL 服务器在启动时将这些表的内容读入内存,后续针对用户的访问控制决策基于权限表的内存副本来实现。
MySQL 访问权限控制系统可以确保只有被允许的(与用户权限匹配的)操作才能够在服务器中执行。当一个用户连接到 MySQL 服务器时,其认证身份由 “请求连接的主机名和用户名” 确定,MySQL 使用 “主机名+用户名” 的方式来识别和区分 “相同主机不同用户” 和 “不同主机相同用户” 发出的请求(例如:从 office.example.com
连接的用户 Lizhengi 和从 home.example.com
连接的用户 Lizhengi 在 MySQL 服务器中实际上是被当作两个不同的连接者来处理的,所以可以设置不同的密码、不同的权限)。
举例:
mysql> show grants for Lizhengi@'localhost';
+-----------------------------------------------+
| Grants for Lizhengi@localhost |
+-----------------------------------------------+
| GRANT SELECT ON *.* TO 'Lizhengi'@'localhost' |
+-----------------------------------------------+
1 row in set (0.00 sec)
mysql> show grants for Lizhengi@'%';
+-----------------------------------------------+
| Grants for Lizhengi@% |
+-----------------------------------------------+
| GRANT SELECT ON *.* TO 'Lizhengi'@'%' |
+-----------------------------------------------+
1 row in set (0.00 sec)
当用户使用客户端程序连接到 MySQL 服务器时,MySQL 的访问控制分为如下两个阶段:
阶段 1:服务器根据身份标识(“主机名+用户名” 组成的账号名称)在 MySQL 的访问权限控制表中查询相关信息,以确定需要接受或拒绝该用户的连接(没有查询到就拒绝连接).如果查询到了用户记录,则校验用户提供的账号密码是否正确,如果密码不正确则拒绝连接。
这个阶段的报错信息类似于:ERROR 1045 (28000): Access denied for user 'Lizhengi'@'localhost'(using password: YES)
。
阶段 2:用户连接成功之后,服务器会检查用户访问请求中的每个声明,确定是否有足够的权限来执行。例如:如果尝试从数据库的表中查询数据行或从数据库中删除表,服务器将验证该用户否具有该表的 SELECT
权限或数据库的 DROP
权限。
如果无对应权限,则这个阶段的报错信息类似于:ERROR 1142 (42000) at line 1: UPDATE command denied to user'Lizhengi'@'localhost' for table 'test_table1'
。
如果某用户在连接期间发生了权限变更(自己或者其他用户修改了权限),那么该用户执行下一条语句时,该权限变更不一定会立即生效。如果未生效,则需要执行 FLUSH PRIVILEGES;
语句。
启动 MySQL 服务后,可以通过 mysql
命令来登录 MySQL 服务器,命令如下:
mysql –h hostname|hostIP –P port –u username –p DatabaseName –e "SQL语句"
下面详细介绍命令中的参数:
-h
参数:后面接主机名或者主机 IP,hostname 为主机,hostIP为 主机IP-P
参数:后面接 MySQL 服务的端口,通过该参数连接到指定的端口。MySQL 服务的默认端口是 3306,不使用该参数时自动连接到 3306 端口,port 为连接的端口号-u
参数:后面接用户名,username 为用户名-p
参数:会提示输入密码DatabaseName
参数:指明登录到哪一个数据库中。如果没有该参数,就会直接登录到 MySQL 数据库中,然后可以使用 USE 命令来选择数据库-e
参数:后面可以直接加 SQL 语句。登录 MySQL 服务器以后即可执行这个 SQL 语句,然后退出 MySQL 服务器举例:
mysql -u root -p -h localhost -P 3306 mysql -e "select host,user from user"
用户是 MySQL 认证的基本元素。您只能通过正确的用户名和密码登录进 MySQL 数据库,然后授予用户不同的权限,以便让不同的用户可以进行不同的操作。
创建用户是精确控制权限的第一步。
在 MySQL 中,您可以使用 CREATE USER
语句在数据库服务器中创建一个新用户。
CREATE USER
语句的基本语法形式如下:
CREATE USER 用户名 [IDENTIFIED BY '密码'][,用户名 [IDENTIFIED BY '密码']];
[ ]
表示可选,也就是说,可以指定用户登录时需要密码验证,也可以不指定密码验证,这样用户可以直接登录。不过,不指定密码的方式不安全,不推荐使用。如果指定密码值,这里需要使用IDENTIFIED BY指定明文密码值举例:
CREATE USER zhang3 IDENTIFIED BY '123123'; -- 默认host是 %
CREATE USER 'robofly'@'localhost' IDENTIFIED BY '123456';
修改用户名:
UPDATE mysql.user SET USER='li4' WHERE USER='wang5';
FLUSH PRIVILEGES;
方式1:使用 DROP
方式删除(推荐)
使用 DROP USER
语句来删除用户时,必须用于 DROP USER
权限。DROP USER
语句的基本语法形式如下:
DROP USER user[,user]…;
举例:
DROP USER li4 ; # 默认删除host为%的用户
DROP USER 'robofly'@'localhost';
方式2:使用 DELETE
方式删除
DELETE FROM mysql.user WHERE Host=’hostname’ AND User=’username’;
FLUSH PRIVILEGES; # 执行完 DELETE 命令后要使用 FLUSH 命令来使用户生效
举例:
DELETE FROM mysql.user WHERE Host='localhost' AND User='Emily';
FLUSH PRIVILEGES;
注意:不推荐通过 DELETE FROM USER u WHERE USER='lizhengi'
进行删除,系统会有残留信息保留。而 DROP USER
命令会删除用户以及对应的权限,执行命令后你会发现 mysql.user
表和 mysql.db
表的相应记录都消失了。
旧的写法如下 :
# 修改当前用户的密码:(MySQL5.7测试有效)
SET PASSWORD = PASSWORD('123456');
这里介绍推荐的写法 :使用 `ALTER USER· 命令来修改当前用户密码。
用户可以使用 ALTER
命令来修改自身密码,如下语句代表修改当前登录用户的密码。基本语法如下:
ALTER USER USER() IDENTIFIED BY 'new_password';
使用 SET
语句来修改当前用户密码。
使用 root
用户登录 MySQ L后,可以使用 SET
语句来修改密码,具体 SQL
语句如下:
SET PASSWORD='new_password';
该语句会自动将密码加密后再赋给当前用户。
使用 ALTER
语句来修改普通用户的密码。
可以使用 ALTER USER
语句来修改普通用户的密码。基本语法形式如下:
ALTER USER user [IDENTIFIED BY '新密码']
[,user[IDENTIFIED BY '新密码']]…;
使用 SET
命令来修改普通用户的密码。
使用 root
用户登录到 MySQL
服务器后,可以使用 SET
语句来修改普通用户的密码。SET
语句的代码如下:
SET PASSWORD FOR 'username'@'hostname'='new_password';
使用 UPDATE
语句修改普通用户的密码(不推荐)。
UPDATE MySQL.user SET authentication_string=PASSWORD("123456")
WHERE User = "username" AND Host = "hostname";
要列出 MySQL 服务器的所有用户,您必须以管理员身份登录 MySQL 数据库服务器。在 mysql 客户端中,我们可以按照如下操作:
mysql -u root -p
输入 root
帐户的密码并按 Enter
:
Enter password: ********
使用下面的 SELECT
语句 从 mysql
数据库中的 user
表中查询所有的用户:
SELECT user, host FROM mysql.user;
当您创建了一个新用户之后,这个新的用户可以登录 MySQL 数据库服务器,但是他可能没有任何权限。只有在赋予他数据库和相关表的权限之后,他才可以进行选择数据库和查询等操作。
在 MySQL 中, GRANT
语句用于给用户赋予权限。
下面是 MySQL GRANT
的语法:
GRANT privilege_type [,privilege_type],..
ON privilege_object
TO user_account;
在这个语法中:
privilege_type
权限类型。要赋予给用户的权限。 常用的包括: ALL
, SELECT
, UPDATE
, DELETE
, ALTER
, DROP
以及 INSERT
等。 更详细的内容请参考:https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_all
privilege_object
权限对象。可以是所有对象,也可以是某个数据库中的所有对象,表 等。常用的包括: *
, *.*
, db_name.*
, db_name.table_name
, table_name
等。
user_account
用户账户。 它使用 username@host
的形式。
MySQL 允许您使用 SHOW GRANTS
语句来显示分配给用户帐户或角色的权限。
以下是 SHOW GRANTS
语句的基本语法:
SHOW GRANTS
[FOR {user | role}
[USING role [, role] ...]]
在这个语法中:
FOR
关键字后指定要显示先前授予用户帐户或角色的权限的用户帐户或角色的名称。如果跳过 FOR
子句,则 SHOW GRANTS
返回当前用户的权限。USING
子句检查与用户角色相关的权限。您在 USING
子句中指定的角色必须事先授予用户。除了可以显示当前用户的权限和角色,要执行 SHOW GRANTS
的语句,你需要有 mysql
系统数据库的 SELECT
权限。
下面说明了 REVOKE
撤销用户帐户的一项或多项权限的语句的基本语法:
REVOKE
priv1 [, priv2 [, ...] ]
ON [object_type] privilege_level
FROM user1 [, user2 [, ...]];
在这个语法中:
REVOKE
关键字后指定要从用户帐户中撤销的以逗号分隔的权限列表。ON
关键字后指定权限的对象类型和权限级别;查看 GRANT
语句以获取有关权限级别的更多信息。FROM
子句中指定一个或多个您要撤销其权限的用户帐户。请注意,要执行这种形式的 REVOKE
语句,您必须具有 GRANT OPTION
权限或必须具有您要撤销的权限。
MySQL 提供的权限列表如下所示(其中,All 或者 All privileges 代表权限列表中除 Grant option 权限之外的所有权限)。
mysql> show privileges;
+----------------------------+---------------------------------------+-------------------------------------------------------+
| Privilege | Context | Comment |
+----------------------------+---------------------------------------+-------------------------------------------------------+
| Alter | Tables | To alter the table |
| Alter routine | Functions,Procedures | To alter or drop stored functions/procedures |
| Create | Databases,Tables,Indexes | To create new databases and tables |
| Create routine | Databases | To use CREATE FUNCTION/PROCEDURE |
| Create role | Server Admin | To create new roles |
| Create temporary tables | Databases | To use CREATE TEMPORARY TABLE |
| Create view | Tables | To create new views |
| Create user | Server Admin | To create new users |
| Delete | Tables | To delete existing rows |
| Drop | Databases,Tables | To drop databases, tables, and views |
| Drop role | Server Admin | To drop roles |
| Event | Server Admin | To create, alter, drop and execute events |
| Execute | Functions,Procedures | To execute stored routines |
| File | File access on server | To read and write files on the server |
| Grant option | Databases,Tables,Functions,Procedures | To give to other users those privileges you possess |
| Index | Tables | To create or drop indexes |
| Insert | Tables | To insert data into tables |
| Lock tables | Databases | To use LOCK TABLES (together with SELECT privilege) |
| Process | Server Admin | To view the plain text of currently executing queries |
| Proxy | Server Admin | To make proxy user possible |
| References | Databases,Tables | To have references on tables |
| Reload | Server Admin | To reload or refresh tables, logs and privileges |
| Replication client | Server Admin | To ask where the slave or master servers are |
| Replication slave | Server Admin | To read binary log events from the master |
| Select | Tables | To retrieve rows from table |
| Show databases | Server Admin | To see all databases with SHOW DATABASES |
| Show view | Tables | To see views with SHOW CREATE VIEW |
| Shutdown | Server Admin | To shut down the server |
| Super | Server Admin | To use KILL thread, SET GLOBAL, CHANGE MASTER, etc. |
| Trigger | Tables | To use triggers |
| Create tablespace | Server Admin | To create/alter/drop tablespaces |
| Update | Tables | To update existing rows |
| Usage | Server Admin | No privileges - allow connect only |
| FLUSH_TABLES | Server Admin | |
| FLUSH_OPTIMIZER_COSTS | Server Admin | |
| INNODB_REDO_LOG_ENABLE | Server Admin | |
| APPLICATION_PASSWORD_ADMIN | Server Admin | |
| REPLICATION_APPLIER | Server Admin | |
| AUDIT_ADMIN | Server Admin | |
| TABLE_ENCRYPTION_ADMIN | Server Admin | |
| SERVICE_CONNECTION_ADMIN | Server Admin | |
| SESSION_VARIABLES_ADMIN | Server Admin | |
| FLUSH_USER_RESOURCES | Server Admin | |
| REPLICATION_SLAVE_ADMIN | Server Admin | |
| CLONE_ADMIN | Server Admin | |
| CONNECTION_ADMIN | Server Admin | |
| SYSTEM_USER | Server Admin | |
| ENCRYPTION_KEY_ADMIN | Server Admin | |
| RESOURCE_GROUP_ADMIN | Server Admin | |
| SHOW_ROUTINE | Server Admin | |
| XA_RECOVER_ADMIN | Server Admin | |
| PERSIST_RO_VARIABLES_ADMIN | Server Admin | |
| BINLOG_ADMIN | Server Admin | |
| BINLOG_ENCRYPTION_ADMIN | Server Admin | |
| BACKUP_ADMIN | Server Admin | |
| GROUP_REPLICATION_ADMIN | Server Admin | |
| SYSTEM_VARIABLES_ADMIN | Server Admin | |
| SET_USER_ID | Server Admin | |
| ROLE_ADMIN | Server Admin | |
| RESOURCE_GROUP_USER | Server Admin | |
| FLUSH_STATUS | Server Admin | |
| INNODB_REDO_LOG_ARCHIVE | Server Admin | |
+----------------------------+---------------------------------------+-------------------------------------------------------+
62 rows in set (0.00 sec)
在上表所示的权限列表中,Context 字段显示了该权限的使用环境(或者叫权限的作用域)。根据 Context 字段内容的不同,权限分为如下三类。
管理权限:用于管理 MySQL 服务器的操作。这些权限是全局性的,授权范围不能是特定的数据库或数据库对象(只能使用 *.*
方式授予,不能使用 db.*
或 db.tb
方式)
|Create user|Event|Process|Proxy|Reload|Replication client|Replication slave|Show databases|Shutdown|Super|Create tablespace|Usage|Grant option|
数据库级别权限:授权范围可以是某数据库或某数据库中的所有对象,也可以是所有数据库(可以使用 *.*
代表全局对象;也可以使用 db.*
代表某库下的所有对象)
|Create|Create routine|Create temporary tables|Drop|Lock tables|References|
数据库对象级别权限:授权范围可以为数据库中的特定对象、数据库内给定类型的对象,也可以是所有数据库(*.*
代表全局对象,db.*
代表某库下的所有对象,db.tb
代表某库下的某对象)。
|Alter|Alter routine|Create view|Delete|Execute|Fil|Indexe|Insert|Select|Show view|Trigger|Update
此外,通常还可以根据使用经验按照如下方式划分
开发权限:
|Delete|Insert|Select|Update|Alter|Create temporary tables|Trigger|Create view|Show view|Alter routine|Create routine|Execute|Index|Event|
管理权限——表级别(这里把带表级别的管理命令都归类为表级别):
|Create|File|Drop|Lock tables
管理权限——服务器级别
|Grant option|Create tablespace|Create user|Process|Proxy|Reload|Replication client|Replication slave|Show databases|Shutdown|Super|Usage|
All
或 All privileges
:除 Grant option
之外,代表其他所有权限。
Alter
:该权限用于使用 ALTER TABLE
语句来更改表的结构(除该权限之外,使用 ALTER TABLE
语句还需要有 Create
和 Insert
权限,使用 ALTER TABLE RENAME
语句需要有旧表上的 Alter
和 Drop
权限,新表上的 Create
和 Insert
权限)。
Alter routine
:该权限用于修改或删除存储过程或存储函数。
Create
:该权限用于创建库和表。
Create routine
:该权限用于创建存储过程或存储函数。
Create tablespace
:该权限用于创建、修改、删除表空间文件和日志组文件。
Create temporary tables
:该权限用于创建临时表。使用 CREATE TEMPORARY TABLE
语句创建临时表,一旦某会话创建临时表成功后,服务器不会在该表上执行权限检查(因为其他会话看不见此表,创建此表的会话一旦断开,临时表就会自动删除)。即,创建临时表的会话可以对该临时表执行任何操作,例如 DROP TABLE
、INSERT
、
UPDATE
、SELECT
等操作。
Create user
:该权限用于使用 ALTER USER
、CREATE USER
、DROP USER
、RENAME USER
、REVOKE ALL PRIVILEGES
语句。
Create view
:该权限用于使用 CREATE VIEW
语句。
Delete
:该权限用于从数据库表中删除数据记录。
Drop
:该权限用于删除现有库、表、视图等对象。另外,如果在分区表上使用 ALTER TABLE … DROP PARTITION
语句,则必须要有表的 Drop
权限,执行 TRUNCATETABLE
也需要有 Drop
权限(但要注意,如果将 MySQL
数据库的 Drop
权限授予用户,则该用户可以删除存储 MySQL
访问权限记录的数据库 mysql
)。
Event
:该权限用于创建、更改、删除或查看 Event Scheduler事件
。
Execute
:该权限用于执行存储过程或存储函数。
File
:该权限用于执行 LOAD DATA INFILE
和 SELECT … INTO OUTFILE
语句以及 LOAD_FILE()
函数来读写服务器主机上的文件。具有 File
权限的用户可以读取服务器主机上的任何可读文件或 MySQL
服务器可读文件。(即,用户可读取 datadir
目录中的任何文件),File
权限还使用户能够在 MySQL 服务器有写入权限的任何目录下创建新文件。所以,作为安全保护措施,服务器不会覆盖现有文件(即,在执行导出数据到文本时,如果文件名重复,则导出语句无法成功执行)。在 MySQL 5.7 版本中,可以使用
secure_file_priv
系统变量限制 File
权限的读写目录。
Grant option
:该权限用于授予或回收其他用户或自己拥有的权限。
Index
:该权限用于创建或删除索引。Index
权限适用于在已存在的表上使用 CREATE INDEX
语句,如果用户具有 Create
权限,则可以在 CREATE TABLE
语句中包含
索引定义语句。
Insert
:该权限用于向表中插入数据记录行。对于 ANALYZE TABLE
、OPTIMIZE TABLE
和 REPAIR TABLE
表维护语句也需要 Insert
权限。
Lock tables
:该权限用于使用 LOCK TABLES 语句对表显式加锁,持有表锁的用户对该表有读写权限,未持有表锁的用户对该表的读写访问会被阻塞。
Process
:该权限用于显示有关在服务器上执行的线程信息(即,关于会话正在执行的语句相关状态信息)。拥有该权限的用户在使用 SHOW PROCESSLIST
语句或 mysqladmin processlist
命令查看有关线程信息时,除可以看到自己的线程信息之外还可以查看到属于其他账号的线程信息。另外,使用 SHOW ENGINE
语句以及查看 information_schema
系统库中的相当一部分表也需要该权限。
Proxy
:该权限使用户能够模仿(伪装、代理)另一个用户。
References
:在创建外键约束时,该权限需要用户具有父表的 References
权限。
Reload
:该权限允许用户使用 FLUSH
语句。拥有该权限的用户还可以使用与 FLUSH
操作等效的 mysqladmin
子命令 flush-hosts
、flush-logs
、flush-privileges
、flushstatus
、flush-tables
、flush-threads
、refresh
和 reload
。其中,reload
子命令会通知服务器将权限表重新加载到内存中;flush-privileges
子命令的作用与 reload
相同;refresh
子命令会通知服务器关闭并重新打开日志文件且刷新所有表。其他 flush-xxx
子命令也会执行类似于刷新的功能,这些子命令刷新的对象更具体。例如,只想刷新日志文件,则使用 flush-logs
子命令。
Replication client
:该权限用于使用 SHOW MASTER STATUS
、SHOW SLAVE STATUS和SHOW BINARY LOGS
语句。
Replication slave
:该权限用于从从库服务器连接到主库服务器并请求主库的 binlog 日志。如果没有此权限,从库将无法请求主库数据库变更的 binlog 日志。
Select
:该权限用于从数据库表中查询数据行记录。使用 SELECT
语句只有实际从表中检索行记录时才需要 Select
权限。但某些 SELECT
语句不需要访问表,并且可以在没有任何数据库权限的情况下执行。例如,使用 SELECT
语句拼接的常量表达式:SELECT 1 + 1; SELECT PI()* 2;
。另外,使用 UPDATE
或 DELETE
语句,当使用 WHERE
子句指定了某字段的条件值时,也需要该字段的 SELECT
权限;否则,你会发现可以使用 UPDATE
不带 WHERE
子句更新全表,却不能使用 WHERE
语句指定更新某些行记录。对基表或视图使用 EXPLAIN
语句,也需要用户对表或视图具有该权限。
Show databases
:该权限用于执行 SHOW DATABASE
语句,对于没有此权限的用户,则只能看到其具有对应访问权限的数据库列表。如果服务器使用了 –skip-show database
选项启动,则没有该权限的用户即使对某库有其他访问权限,也不能使用 SHOW DATABASES
语句查看任何数据库列表(会报错:ERROR 1227 (42000): Access denied; you need (at least one of) the SHOW DATABASES privilege(s) for this operation)
。
`Show view:该权限用于执行SHOW CREATE VIEW语句。对视图使用EXPLAIN语句也需要此权限。
Shutdown
:该权限用于执行 SHUTDOWN
语句、mysqladmin shutdown
命令和 mysql_shutdown()
C API 函数。
Super
:该权限用于进行如下操作和服务器行为:
Super
权限(如果修改会话级别的系统配置变量需要 Super
权限,在变量的解释文档中会进行说明,例如 binlog_format
、sql_log_bin
和 sql_log_off
);START TRANSACTION
语句);CHANGE MASTER TO
和 CHANGE REPLICATION FILTER
语句;PURGE BINARY LOGS
和 BINLOG
语句;DEFINER
属性,则拥有 Super
权限的用户就算不是该视图或存储程序的创建者,也仍然可以执行该视图或存储程序;CREATE SERVER
、ALTER SERVER
和 DROP SERVER
语句;mysqladmin debug
命令;InnoDB key
自旋;DES_ENCRYPT()
函数启用读取 DES 密钥文件;Super
权限的账户还可以执行的操作有:
KILL
语句或 mysqladmin kill
命令来终止属于其他账户的线程(注意:无论是否拥有 Super
权限,用户总是可以 kill
自己的线程);max_connections
系统变量定义的值,服务器也会接受来自具 Super
权限的用户的一个额外连接。read_only
系统变量,具有 Super
权限的用户也仍然可以执行数据更新,包括显式的操作更新和隐式的操作更新(账户管理语句 GRANT
和 REVOKE
等触发的表更新)。Super
权限的用户连接服务器时,服务器不执行 init_connect
系统变量指定的内容。offline_mode
系统变量)的服务器不会中断具有 Super
权限的用户的连接,且仍然接受具有 Super
权限的用户的新连接请求。Trigger
:该权限用于触发器的操作。用户必须拥有某表的该权限才能针对该表创建、删除、执行或查看其触发器。
Update
:该权限用于执行对数据库表中的数据行更新操作。
Usage
:该权限代表用户“无任何权限”。全局级别权限,拥有该权限的用户可以登录到数据库服务器中,但在默认配置下除能够执行部分show命令之外,其他任何数据变更和数据库查询操作都无法执行。
Ps:只向用户授予其需要的权限,不要授予额外的多余的权限,特别是管理权限,例如 File
、Grantoption
、Alter
、Shutdown
、Process
、Super
等。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。