1,查看本用户具有的权限
SELECT * FROM SESSION_PRIVS;
2,当普通用户具有alter user的权限时,其可以更改管理员的密码,达梦和oracle都是如此
3,如果您想让用户 scott
在特定模式 A
下创建表,您需要为其授予在该模式下的表创建权限。
在默认情况下,scott用户建表会建在scott模式下,实验目的是使scott能在A模式下建表,模式A是属于普通用户A的模式。
- 方法一:DBA用户赋予scott用户 create any table的权限,这样A可在任意模式下建表。
- 方法二:在模式 A 下创建一个角色,并授予创建表的权限给该角色,或是直接赋予A的create table权限给scott(行不通)
- 此时查询scott的所具有的权限表,发现并没有什么变化。用户scott原来就具有create table权限,将A的create table权限赋予scott后,权限表不变,应该表明这种方法没用。不同用户具有的create table权限只能在默认对应的模式下创建表,即使A将其能在A模式下创建表的create table权限赋予用户scott,scott也无法在模式A上创建表,显示权限不足
由于scott用户没有select A模式下表的权限,所以即使在模式A下创建了表,也无法看到该表,不知道该表是否存在。以下是解决方法,我使用 PL/SQL 循环来动态地为模式中的每个表授予权限,这样用户scott建立的查询就能查询到模式A中的表了
BEGIN
FOR tbl IN (SELECT table_name FROM all_tables WHERE owner = 'A') LOOP
EXECUTE IMMEDIATE 'GRANT SELECT ON A.' || tbl.table_name || ' TO scott';
END LOOP;
END;
之前查询特权表失误,没有发现select any table的权限,就想另一种解决方法,不过oracle好像不能直接使用通配符*来直接赋予用户权限,结果显示表明无效。
GRANT SELECT ON A.* TO scott > ORA-00903: 表名无效
然后就使用PL/SQL 循环来动态地为模式中的每个表授予权限。后来发现其实存在select any table的权限。
4,创建用户指定默认表空间和临时表空间
CREATE USER sale IDENTIFIED BY 123 DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;
默认表空间(DEFAULT TABLESPACE): 当用户创建表或索引等对象时,如果没有显式指定表空间,则这些对象将被创建在用户的默认表空间中。默认表空间通常用于存储用户的永久数据,例如表和索引。如果没有为用户指定默认表空间,则系统会使用默认的表空间。
临时表空间(TEMPORARY TABLESPACE): 临时表空间用于存储用户在执行查询和排序等操作时生成的临时数据和临时对象。这些临时对象通常是数据库系统用于执行查询的中间结果,例如在排序或聚合操作中使用的临时文件。临时表空间的目的是为了减少在执行复杂查询时对系统的开销,并提高查询的性能。
5,查看用户所属于的表空间
SELECT username, default_tablespace
FROM dba_users
WHERE username = 'YOUR_USERNAME';