5-对象的访问权限

对象的访问权限知识点

对象的分类

在数据库中,数据库的表、索引、视图、缺省值、规则、触发器等等、都可以被称为数据库对象,其中对象主要分为两类

1、模式(schema)对象:模式对象可以理解为一个存储目录、包含视图、索引、数据类型、函数和操作符等。也就是放在模式下的对象,都被叫做模式对象

2、非模式对象:其他的数据库对象、如数据库、表空间、用户

对象访问权限概述

1、对象都会有owner(所有者),所有者一般是对象的创建者,但所有者是可以被改变的;如使用root用户创建了一个目录,该目录当前的所有者是root,当然还可以使用chown命令来将所有者改为kingbase

2、初始转态下,只有所有者(或者超级用户)呢个够对改对象执行任何操作

3、其他用户和角色想要使用该对象,需要被授予相关的权限

定义访问权限(GRANT 权限 ON 对象类型 对象名 TO 用户/角色)

定义访问权限,相当与给予某个用户或角色权限:记住GRANT 权限 ON 对象类型 对象名 TO 用户/角色,即给用户/角色授予针对某个对象的某种权限

授予权限主要是使用GRANT来授权,但不同的对象类型支持的权限类型是有差异的

1、针对数据库的授权

在此之前,我们应该先明白数据库具有什么权限,才能为数据库进行正确的授权

语法:GRANT [CREATE | CONNECT | TEMPORARY | TEMP |…| ALL [PRIVILEGES] ]

ON DATABASE database_name;给哪个数据库权限

TO role_specification;给哪个用户

权限描述
CRETAE在数据库下创建对象的权限
CONNECT连接数据库的权限
TEMPORARY在数据库下创建临时表
TEMP在数据库下创建临时表

2、针对模式的授权

GRANT [ CREATE | USAGE |…| ALL [PRIVILEGES] ]

ON SCHEMA schema_name;给哪个模式授权

TO role_specification;给哪个用户授权

权限描述
CREATE在这个模式下可以再创建对象
USAGE因为模式相当与一个文件夹,当有了usage权限后就可以进入该文件夹内

3、针对表空间授权

GRANT [ CREATE | ALL [ PRIVILEGES ] ]

ON TABLESPACE tablespace_name

TO role_specification

4、针对表的授权

GRANT [ SELECT | INSERT | UPDATE | TRUNCATE | REFERENCES | TRIGGER | DELETE |…| ALL [PRIVILEGES]]

ON { [ TABLE ] table_name

​ | ALL TABLES IN SCHEMA schema_name }

TO role_specification

权限描述
SELECT查询
INSERT插入
UPDATE更新
TRUNCATE(truncate)截断,快速删除表中的所有数据
REFERENCES(references)外键约束,在表中创建一个字段
TRIGGER(trigger)触发器
EDLETE删除

5、针对列的授权

GRANT { [ SELECT | INSERT | UPDATE | REFERNCES] ( column_name […] ) […] | ALL [PRIVILEGES] ( colume_name […] ) }

ON [ TABLE ] table_name

TO role_specification

6、针对序列的授权

GRANT { [ USAGE | SELECT | UPDATE ] … [ ALL [PRIVILEGES ]]}

ON { SEQUENCE sequence_name

| ALL SEQUENCES IN SCHEMA schema_name }

TO role_specification

7、针对函数的授权

GRANT { EXECUTE | ALL [PRIVILEGES ] }

ON { FUNCTION function_name ( [ argmode [arg_name] arg_type ] ) | ALL FUNCTIONS IN SCHEMA schema_name }

TO role_specfication

移除访问权限(REVOKE 权限 ON 对象类型 对象名 TO 用户/角色)

移除访问权限,就是针对某个用户或角色去除它的权限,记住:REVOKE 权限 ON 对象类型 对象名 TO 用户/角色,即给用户/角色去除针对某个对象的某种权限

1、针对数据库的授权

REVOKE [ GRANT OPTION FOR ] [CREATE | CONNECT | TEMPORARY | TEMP |…| ALL [PRIVILEGES] ]

ON DATABASE database_name;给哪个数据库权限

FROM { [ GROUP ] role_name | PUBLIC } […] [ CASCADE | RESTRICT ]

2、针对模式授权

REVOKE [ GRANT OPTION FOR ] [ CREATE | USAGE |…| ALL [PRIVILEGES] ]

ON SCHEMA schema_name;给哪个模式授权

FROM { [ GROUP ] role_name | PUBLIC } […] [ CASCADE | RESTRICT ]

3、针对表空间授权

REVOKE [ GRANT OPTION FOR ] [ CREATE | ALL [ PRIVILEGES ] ]

ON TABLESPACE tablespace_name

FROM { [ GROUP ] role_name | PUBLIC } […] [ CASCADE | RESTRICT ]

4、针对表授权

REVOKE [ GRANT OPTION FOR ] [ SELECT | INSERT | UPDATE | TRUNCATE | REFERENCES | TRIGGER | DELETE |…| ALL [PRIVILEGES]]

ON { [ TABLE ] table_name

​ | ALL TABLES IN SCHEMA schema_name }

FROM { [ GROUP ] role_name | PUBLIC } […] [ CASCADE | RESTRICT ]

5、针对列的授权

REVOKE [ GRANT OPTION FOR ] { [ SELECT | INSERT | UPDATE | REFERNCES] ( column_name […] ) […] | ALL [PRIVILEGES] ( colume_name […] ) }

ON [ TABLE ] table_name

FROM { [ GROUP ] role_name | PUBLIC } […] [ CASCADE | RESTRICT ]

6、针对序列授权

REVOKE [ GRANT OPTION FOR ] { [ USAGE | SELECT | UPDATE ] … [ ALL [PRIVILEGES ]]}

ON { SEQUENCE sequence_name

| ALL SEQUENCES IN SCHEMA schema_name }

FROM { [ GROUP ] role_name | PUBLIC } […] [ CASCADE | RESTRICT ]

7、针对函数授权

REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [PRIVILEGES ] }

ON { FUNCTION function_name ( [ argmode [arg_name] arg_type ] ) | ALL FUNCTIONS IN SCHEMA schema_name }

TO role_specfication

权限描述符

符号全称解释
aINSERT插入,针对表或视图进行
rSELECT查询,针对表或视图进行
wUPDATE更新,针对表或视图进行
dDELECT删除,针对表或视图进行
DTRUNCATE清空记录,针对表
xREFERENCES参照引用,针对表
tTRIGGER创建触发器,针对表
XEXECUTE执行,针对存储过程(pl/sql对象)
UUSAGE使用权,针对模式,可以进入到模式下
CCREATE创建对象,针对模式或数据库
cCONNECT创建连接,针对数据库
TTEMPORARY创建临时表,针对数据库

如"user01=ar*/SYSTEM"

上述内容对应的是[被授权用户]=权限明细[*]/授权用户,其中[被授权用户]是user01

ar表示INSERT和SELECT,r*表示user01拥有r(SELECT)权限的转授权,SYSTEM说明user01的ar*权限是来自与SYSTEM用户的授权

"*"表示被授权用户拥有该权限的转授权(用于级联授权)

实验1:查看对象访问权限的主要方式

图形化界面查看权限

查看system对数据库的对象权限,右键[system]用户,点击[编辑用户],点击[对象权限]即可查看全部权限

image-20241030112301463

通过"ksql元命令"来查看权限

查看数据库下的权限

登录system用户查看system对数据库的存储权限,可以使用"\l"来查看权限、

test=# \l数据库列表名称    | 拥有者 | 字元编码 |  校对规则   |    Ctype    |     存取权限      
-----------+--------+----------+-------------+-------------+-------------------kingbase  | system | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | security  | system | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | template0 | system | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/system        +|        |          |             |             | system=CTc/systemtemplate1 | system | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/system        +|        |          |             |             | system=CTc/systemtest      | system | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | 
(5 行记录)

可以看到存储权限那一列中,就采用了权限描述符来描述权限的具体信息

如"system=CTc/system",其表示有system授予system权限,C允许创建数据库的权限,T允许创建临时表的权限,c允许连接的权限

查看模式下的权限

可以使用元命令"\dn+",可以从存储权限中看到权限描述符

如sso=UC/system;表示有system用户授予sso,U表示sso用户可以进入到模式下,C表示sso用户可以在模式下创建对象

test=# \dn+架构模式列表名称       | 拥有者 |     存取权限     |          描述          
------------------+--------+------------------+------------------------anon             | system | system=UC/system+| |        | sso=UC/system    | dbms_sql         | system |                  | public           | system | system=UC/system+| standard public schema|        | =UC/system       | src_restrict     | system | system=UC/system+| |        | sso=UC/system    | sysaudit         | system | system=UC/system+| |        | sso=UC/system   +| |        | sao=UC/system   +| |        | =UC/system       | sysmac           | system | system=UC/system+| |        | sso=UC/system   +| |        | =U/system        | xlog_record_read | system |                  | 
(7 行记录)

查看表下的权限

使用元命令"\dp"可以查看表的信息

test=# \dp存取权限架构模式 |          名称           | 类型 |       存取权限        | 列特权 | 策略 
----------+-------------------------+------+-----------------------+--------+------public   | sys_stat_statements     | 视图 | system=arwdDxt/system+|        | |                         |      | =r/system             |        | public   | sys_stat_statements_all | 视图 | system=arwdDxt/system+|        | |                         |      | =r/system             |        | 
(2 行记录)

1、使用system用户登录test数据库

test=# \conninfo
以用户 "system" 的身份,通过套接字"/tmp"在端口"54321"连接到数据库 "test"

2、创建user01用户

test=# create user user01;
test=# alter user user01 password 'kingbase'
test-# ;									//修改user01的密码
ALTER ROLE

3、在public模式下创建t01表(字段为id和name,类型分别为int和text)

test=# create table public.t01 (id int,name text);
CREATE TABLE

4、向t01表中插入数据

test=# insert INTO public.t01 values (100,'a'),(200,'b');
INSERT 0 2
test=# select * from public.t01 
test-# ;id  | name 
-----+------100 | a200 | b
(2 行记录)

5、授权user01用户可查询t01表(第一行数据为100,‘a’;200,‘b’)

test=# grant SELECT on public.t01 TO user01;
GRANT
test=# \c - user01
您现在已经连接到数据库 "test",用户 "user01".
test=> select * from public.t01 ;id  | name 
-----+------100 | a200 | b
(2 行记录)

6、查看授权结果

test=# \dp public.t01 存取权限架构模式 | 名称 |  类型  |       存取权限        | 列特权 | 策略 
----------+------+--------+-----------------------+--------+------public   | t01  | 数据表 | system=arwdDxt/system+|        | |      |        | user01=r/system       |        | 
(1 行记录)

通过"数据字典"查看访问权限

数据字典是将数据库系统的信息组织到表中统一管理,也可称之数据字典表SystemCatalogTable,KES中的数据字典组织到Schema中

就是将数据库的全部信息全部都放在一张表内,以供我们查询,而这种表就被称为数据字典(类似与密码字典)

但是这种方法难度较大,需要记忆较多数据字典的视图以及其对应的字段

通过权限查询函数来查看访问权限

通过使用权限查询函数。来观察返回值是true还是flase

实验2:对象所有权限实验

查看表的所有者

使用"\dt+ table_name"可以查看表的拥有者

test=# \dt+ 关联列表架构模式 | 名称 |  类型  | 拥有者 | 大小  | 描述 
----------+------+--------+--------+-------+------public   | t01  | 数据表 | system | 16 kB | public   | t02  | 数据表 | user02 | 16 kB | 
(2 行记录)

验证对象的创建者默认就是对象的所有者

创建t02表

1、使用system用户身份登录test数据库

test=# \conninfo                                                                                
以用户 "system" 的身份,通过套接字"/tmp"在端口"54321"连接到数据库 "test"

2、在public模式中创建t02表

test=# create table public.t02 (id int,name text);
CREATE TABLE

查看t02的所有者

test=# \dt+ public.t02 关联列表架构模式 | 名称 |  类型  | 拥有者 |    大小    | 描述 
----------+------+--------+--------+------------+------public   | t02  | 数据表 | system | 8192 bytes | 
(1 行记录)

可以看到我们有system用户创建的t02表这个对象,那么t02表就是属于system用户的

改变对象的所有者

创建user02用户;查看t02表的所有者

test=# create user user02;
CREATE ROLE
test=# alter user user02 password 'kingbase';
ALTER ROLE
test=# \dt+ t02关联列表架构模式 | 名称 |  类型  | 拥有者 |    大小    | 描述 
----------+------+--------+--------+------------+------public   | t02  | 数据表 | system | 8192 bytes | 
(1 行记录)

将t02表的拥有者修改为user02;查看t02表的所有者

test=# alter table public.t02 owner to user02;
ALTER TABLE
test=# \dt+ public.t02 关联列表架构模式 | 名称 |  类型  | 拥有者 |    大小    | 描述 
----------+------+--------+--------+------------+------public   | t02  | 数据表 | user02 | 8192 bytes | 

可以看到经过我们修改之后,public模式下的t02表的拥有着从system更改到user02上

拥有者在对象上的特殊权限不能被授予或撤销

像DROP、GRANT、REVOKE这些特殊权限总是隐式地属于所有者,是不能直接查询到这些权限信息的,需要在使用数据字典来查看

使用元命令查看t02表的权限列表

test=# \dt+ public.t02 关联列表架构模式 | 名称 |  类型  | 拥有者 |    大小    | 描述 
----------+------+--------+--------+------------+------public   | t02  | 数据表 | user02 | 8192 bytes | 
(1 行记录)
test=# \dp+ public.t02 存取权限架构模式 | 名称 |  类型  | 存取权限 | 列特权 | 策略 
----------+------+--------+----------+--------+------public   | t02  | 数据表 |          |        | 
(1 行记录)

用数据字典查看t02表的权限列表

在数据字典内可以看到如DROP、GRANT等这些特殊权限的列表

test=# select * from information_schema.table_privileges where table_catalog='test' and table_schema='public' and table_name='t02'; grantor | grantee | table_catalog | table_schema | table_name | privilege_type | is_grantable | with_hierarchy 
---------+---------+---------------+--------------+------------+----------------+--------------+----------------user02  | user02  | test          | public       | t02        | INSERT         | YES          | NOuser02  | user02  | test          | public       | t02        | SELECT         | YES          | YESuser02  | user02  | test          | public       | t02        | UPDATE         | YES          | NOuser02  | user02  | test          | public       | t02        | DELETE         | YES          | NOuser02  | user02  | test          | public       | t02        | TRUNCATE       | YES          | NOuser02  | user02  | test          | public       | t02        | REFERENCES     | YES          | NOuser02  | user02  | test          | public       | t02        | TRIGGER        | YES          | NO
(7 行记录)

最终验证对象拥有着的DROP、GRANT、REVOKE等特殊权限不能被授予或撤销

test=# revoke drop on TABLE t02 from user02;
错误:  未知的权限类型: "drop
test=# REVOKE GRANT ON TABLE t02 FROM user02;
错误:  语法错误 在 "ON" 或附近的
第1行REVOKE GRANT ON TABLE t02 FROM user02;
test=# GRANT drop on table t02 to user02;
错误:  未知的权限类型: "drop"
test=# GRANT revoke on table t02 to user02;
错误:  未知的权限类型: "revoke"

报错提示未知权限的原因是在普通的查询权限中根本是查不到DROP、GRANT等这种特殊权限的,所以才会显示未知权限

所有者或system可以撤销所有者在表中的普通权限

修改t02表的所有者user02用户的权限,只保留对t02表的查询权限

使用user02用户或system用户登录test数据库

1、撤销user02用户在t02表上的所有普通权限

test=# revoke all on TABLE t02 from user02;
REVOKE

2、授予用户user02对t02表的查询权限

test=# grant SELECT on TABLE t02 to user02;
GRANT

3、实验验证user02对t02表的权限

test=# insert INTO public.t02 values (100,'a');
INSERT 0 1

查看t02表的权限信息

test=# \dt+ public.t02 									//查看public.t02的拥有者关联列表架构模式 | 名称 |  类型  | 拥有者 | 大小  | 描述 
----------+------+--------+--------+-------+------public   | t02  | 数据表 | user02 | 16 kB | 
(1 行记录)
test=# \dp public.t02 								    //查看public.t02下的权限存取权限架构模式 | 名称 |  类型  |    存取权限     | 列特权 | 策略 
----------+------+--------+-----------------+--------+------public   | t02  | 数据表 | user02=r/user02 |        | 
(1 行记录)

可以看到原本user02是t02的所有者,应该拥有全部的普通权限,但我们依然可以撤销user02的普通权限,并且再加上select的权限给user02

实验3:授权普通用户访问对象

实验准备

1、再schema为public下创建测试表t03,其中t03的字段分别为id和name,类型分别为int和text

test=# create table public.t03 (id int,name text);
CREATE TABLE

2、创建user03用户,密码为kingbase

test=# create user user03 password 'kingbase';
CREATE ROLE

授予用户访问数据库的权限

1、给user03授予可以连接数据库test的权限

test=# grant CONNECT ON DATABASE test TO user03;
GRANT

2、查看test数据库的权限列表

test=# \l test 数据库列表名称 | 拥有者 | 字元编码 |  校对规则   |    Ctype    |     存取权限      
------+--------+----------+-------------+-------------+-------------------test | system | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =Tc/system       +|        |          |             |             | system=CTc/system+|        |          |             |             | user03=c/system
(1 行记录)

image-20241030184803672

授予用户访问模式(schema)的权限

1、授予user03用户可以访问public模式

test=# grant USAGE ON SCHEMA public TO user03;
GRANT

2、查看public模式的权限列表

test=# \dn+ public 架构模式列表名称  | 拥有者 |     存取权限     |          描述          
--------+--------+------------------+------------------------public | system | system=UC/system+| standard public schema|        | =UC/system      +| |        | user03=U/system  | 
(1 行记录)

image-20241030184921532

授予用户访问表的权限

1、授权user03可以查询t03表

test=# grant SELECT ON TABLE public.t03 TO user03;
GRANT

2、查看t03表的权限列表

test=# \dp public.t03存取权限架构模式 | 名称 |  类型  |       存取权限        | 列特权 | 策略 
----------+------+--------+-----------------------+--------+------public   | t03  | 数据表 | system=arwdDxt/system+|        | |      |        | user03=ar/system      |        | 
(1 行记录)

image-20241030185553852

授予用户先表中插入数据的权限

1、授予user03可以向t03表插入数据

test=# grant INSERT ON TABLE public.t03 TO user03 ;
GRANT

2、查看t03表的权限列表

test=# \dp public.t03存取权限架构模式 | 名称 |  类型  |       存取权限        | 列特权 | 策略 
----------+------+--------+-----------------------+--------+------public   | t03  | 数据表 | system=arwdDxt/system+|        | |      |        | user03=ar/system      |        | 
(1 行记录)

image-20241030185553852

如图,user03=ar/system表示有system用户授予user03,"a"插入权限。"r"查询权限

验证

1、使用user03用户登录test数据库

test=# \c test user03
您现在已经连接到数据库 "test",用户 "user03".
test=> \conninfo 
以用户 "user03" 的身份,通过套接字"/tmp"在端口"54321"连接到数据库 "test"

2、user03用户能查询t03表

test=> select * from public.t03 ;id | name 
----+------
(0 行记录)

3、user03能先t03表中插入数据,插入数据为(1,‘a’)和(2,‘b’)

test=> select * from public.t03 ;id | name 
----+------1 | a2 | b
(2 行记录)

收回public角色的默认权限

查看public角色拥有的默认权限

1、查看public角色再test数据库中的权限

其中"=Tc"表示public角色内的所有用户对test数据库拥有Tc权限

补充说明:T表示TEMPORARY拥有临时创建表权限,c表示CONNECT拥有连接权限

test=> \l test数据库列表名称 | 拥有者 | 字元编码 |  校对规则   |    Ctype    |     存取权限      
------+--------+----------+-------------+-------------+-------------------test | system | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =Tc/system       +|        |          |             |             | system=CTc/system+|        |          |             |             | user03=c/system
(1 行记录)

image-20241030192950827

2、查看public角色在public模式中的权限

注:"=UC"表示public角色内的所有用户对public模式拥有UC权限

"U"表示USAGE能够进入public模式下,"C"表示能在public模式下创建对象

test=> \dn+ public 架构模式列表名称  | 拥有者 |     存取权限     |          描述          
--------+--------+------------------+------------------------public | system | system=UC/system+| standard public schema|        | =UC/system      +| |        | user03=U/system  | 
(1 行记录)

image-20241030193039292

验证public角色拥有的默认权限

注:所有用户默认都属于public,所有用户默认能登录test库,能在public模式下创建对象

1、使用system用户登录test数据库,创建user04用户

您现在已经连接到数据库 "test",用户 "system".
test=# \conninfo 
test=# create user user04 password 'kingbase';
CREATE ROLE

2、使用user04登录test数据库,使用user04在public模式下创建表t04

test=> \conninfo
以用户 "user04" 的身份,通过套接字"/tmp"在端口"54321"连接到数据库 "test"
test=> create table public.t04 (id int,name text);
CREATE TABLE

收回public角色在test数据库的默认权限

1、使用system登录test数据库,回收public角色在test数据库的所有权限

test=# revoke all ON DATABASE test FROM PUBLIC ;
REVOKE

查看test数据库的权限列表,此时应该"UC/system"已经消失

image-20241030193652465

2、验证,此时user04已经无权登录test数据库了

test=# \c test user04
致命错误:  访问数据库"test"的权限不够
描述:  用户没有CONNECT权限.
保留上一次连接

回收public角色在public模式中的默认权限

1、显式的授权user04可登录test数据库,显式的意思就是使用system直接给user04授予权限

test=# grant CONNECT ON DATABASE test TO user04 ;
GRANT

2、收回public角色在public模式中的所有权限

可以看到public模式下"=UC/system"已经消失(被收回)

test=# revoke ALL ON SCHEMA public FROM PUBLIC ;
REVOKE
test=# \dn+ public  架构模式列表名称  | 拥有者 |     存取权限     |          描述          
--------+--------+------------------+------------------------public | system | system=UC/system+| standard public schema|        | user03=U/system  | 
(1 行记录)

image-20241030193951457

3、验证user04用户在模式中创建对象的权限

如果操作没有问题,那么user04是不能在public模式下创建对象(一个表)

test=> create table public.t05 (id int,name text);
错误:  对模式 public 权限不够
第1行create table public.t05 (id int,name text);

总结

我们在学习数据库中的角色/用户的权限的时候,一定要知道数据库的层级关系是怎么样的,从而授予/回收权限

如,test数据库下是public模式,public模式下是t03数据表等等

在授权一个用户/角色可以读取表时,也是按照这样的层级关系来授权;授予用户对test数据库的连接(CONNECT)权限,接着授予用户对public模式的进入(USAGE)权限,最后授予用户对t03数据表有插入和查询权限(INSERT和SELECT);这样一个最基本的用户/角色授权就完成了

当我们不去授权用户/角色对数据库和模式的权限时,而是直接授权对数据表的权限时,其实也是可以正常地查询到数据表的,这就是因为public角色的存在,默认情况下,所有创建的用户都是属于public角色的;而public角色是对数据库有"Tc"权限的,T表示可以创建临时表,c表示允许连接,对所有的模式有UC权限的,U表示进入模式权限,C表示允许在模式下创建对象

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

药方新解:Spring Boot中药实验管理系统设计

3系统分析 3.1可行性分析 通过对本中药实验管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本中药实验管理系统采用SSM框架,JAVA作为开发语…

动态规划-完全背包问题——279.完全平方数

1.题目解析 题目来源 279.完全平方数——力扣 测试用例 2.算法原理 1.状态表示 完全背包问题通常都是使用一个二维数组来表示其状态,这里是 dp[i][j]:在[1,i]区间选择平方数,当此时已选择平方数的总和完全等于j时所选择的最小平方数个数 …

二叉树的层序遍历

一、题目 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,null,null,15,7}, 该二叉树层序遍历的结果是 [[3],[9,20],[15,7]] 二、解决方案 2.0 树…

模型训练过程的显存占用实测

依赖项说明 pip install nvitop pip install timm pip install peft后续的显存占用数据截图,均基于nvitop命令实现 1、模型显存占用说明 1.1 理论占用值 在 一文讲明白大模型显存占用(只考虑单卡)与大模型显存占用分析都对模型训练过程中…

后端分层解耦

引入 在上篇所举的例子中,我们将所有的代码均放在HelloControl方法之中,这样会导致代码的复用性、可读性较差,难以维护。因此我们需 三层架构 在之前的代码中,代码大体可以分为三部分:数据访问、数据逻辑处理、响应数…

AIGC 入门全攻略:开启智能创作新时代

一、AIGC 初印象 AIGC,即人工智能生成内容,是继专业生产内容(PGC)、用户生产内容(UGC)之后的新型内容创作方式。它涵盖了文本生成、图像与视频创作、音频生成等多个领域,正在以惊人的速度改变着…

约克VRF地暖中央空调,让你舒适过冬

想要冬季过得舒服,采暖必须要到位!对于没有集中供暖的南方地区来说,冬季室内阴冷刺骨。 选购地暖中央空调时,强效制热的能力必不可少,让我们可以享受温暖的室内温度,有效减少室内忽冷忽热的温度变化。 约克…

基于Java Springboot宠物领养救助平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

使用原生 OpenTelemetry 解锁各种可能性:优先考虑可靠性,而不是专有限制

作者:来自 Elastic Bahubali Shetti•Miguel Luna Elastic 现在支持使用 OTel Operator 在 Kubernetes 上部署和管理 Elastic Distributions of OpenTelemetry (EDOT)。SRE 现在可以访问开箱即用的配置和仪表板,这些配置和仪表板旨在通过 Elastic Observ…

基于python Django的boss直聘数据采集与分析预测系统,爬虫可以在线采集,实时动态显示爬取数据,预测基于技能匹配的预测模型

本系统是基于Python Django框架构建的“Boss直聘”数据采集与分析预测系统,旨在通过技能匹配的方式对招聘信息进行分析与预测,帮助求职者根据自身技能找到最合适的职位,同时为招聘方提供更精准的候选人推荐。系统的核心预测模型基于职位需求技…

安装 python-pcl 遇到的问题

安装python-pcl 成功安装错误尝试尝试一尝试二尝试三 本人环境 Ubuntu 22.04.4LTS ros2-humble cpython 3.0.11 python 3.10.12 libpcl-dev 1.12.1dfsg-3build1 pcl-tools 1.12.1dfsg-3build1 代码摘抄来源:Breadcrumbsouster-ros-extras/scripts/ros2_pcl_filters.…

【C++进阶篇】——string类的使用

文章目录 前言:1. string的介绍2. string类对象的常见构造3. string类对象的容量操作4. string类对象的访问5. 迭代器6. string类对象的修改操作7. string类对象的字符串运算8.string类成员函数9.string类非成员函数10.string类常量成员 前言: std::str…

vmware虚拟机给创建的centos扩展磁盘步骤

1.先看看原来的磁盘信息,目前磁盘是20g的,重点关注红色箭头指向的地方,一个17g 可用11g,接下来要对其进行扩展 df -h2.关闭当前虚拟机,先进行磁盘扩展,目前我扩展到了50g。 3.重新开启虚拟机,…

开源物业管理系统助力智能社区提升服务效率与用户体验

内容概要 开源物业管理系统是一种灵活、智能的解决方案,专为社区物业管理而生。随着智能社区的发展,这种系统变得越来越重要。它不仅帮助物业管理者高效地处理日常事务,还提升了居民的生活体验。在这个日新月异的时代,开源物业管…

深入理解 Redis跳跃表 Skip List 原理|图解查询、插入

1. 简介 跳跃表 ( skip list ) 是一种有序数据结构,通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。 在 Redis 中,跳跃表是有序集合键的底层实现之一,那么这篇文章我们就来讲讲跳跃表的实现原理。 2. …

【数据库】mysql数据库迁移前应如何备份数据?

MySQL 数据库的备份是确保数据安全的重要措施之一。在进行数据库迁移之前,备份现有数据可以防止数据丢失或损坏。以下是一套详细的 MySQL 数据库备份步骤,适用于大多数情况。请注意,具体的命令和工具可能因 MySQL 版本的不同而有所差异。整个…

AWTK-WIDGET-WEB-VIEW 实现笔记 (4) - Ubuntu

Ubuntu 上实现 AWTK-WIDGET-WEB-VIEW 开始以为很简单,后来发现是最麻烦的。因为 Ubuntu 上的 webview 库是 基于 GTK 的,而 AWTK 是基于 X11 的,两者的窗口系统不同,所以期间踩了几个大坑。 1. 编译 AWTK 在使用 Linux 的输入法时…

Rocket入门练习

搭建部署: 1. 部署平台和部署方式: Ubuntu:22.10 部署方式:源码安装部署 a. 下载源码到本地:rocketmq-all-5.3.1-source-release.zip $ unzip rocketmq-all-5.3.1-source-release.zip // 解压缩 $ cd rocketmq-all…

视觉SLAM相机——单目相机、双目相机、深度相机

一、单目相机 只使用一个摄像头进行SLAM的做法称为单目SLAM,这种传感器的结构特别简单,成本特别低,单目相机的数据:照片。照片本质上是拍摄某个场景在相机的成像平面上留下的一个投影。它以二维的形式记录了三维的世界。这个过程中…

EM算法与高斯混合聚类:理解与实践

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…