数据库系统相关SQL
阅读原文时间:2023年07月12日阅读:1

杀进程

查出所有被锁住的表

select b.owner TABLEOWNER, b.object_name TABLENAME, c.OSUSER LOCKBY,
c.USERNAME LOGINID, c.sid SID, c.SERIAL# SERIAL
from v$locked_object a,dba_objects b, v$session c
where b.object_id = a.object_id AND a.SESSION_ID =c.sid;

通过SID, SERIAL解锁

--alter system kill session 'SID, SERIAL';

oracle中查找某个表属于哪个用户?

select owner from dba_tables where table_name=upper('表名');

不过这个要求你当前登录的用户权限为dba才行,或有查询这个视图的权限才行。

在SQL中,查看服务器端的编码

SELECT * FROM V$NLS_PARAMETERS WHERE parameter LIKE '%CHARACTERSET'

查找外键的父项

找出外键约束名称,比如FK_REF27_AGENCY,然后使用如下语句

select              
A.TABLE_NAME as OWNER,
B.TABLE_NAME as REFER
from
dba_constraints A,
dba_constraints B
where
A.constraint_name='FK_REF27_AGENCY' and
A.CONSTRAINT_TYPE = 'R' and
A.R_CONSTRAINT_NAME = B.CONSTRAINT_NAME
order by
A.TABLE_NAME,
B.TABLE_NAME;

owner是外键所在的表,REFER是所依赖的表(父项关键字)

有两张系统表: dba_constraintsUSER_CONSTRAINTS分别存储了系统和用户级约束

悲观封锁

锁在用户修改之前就发挥作用:

Select ..for update(nowait)
Select * from tab1 for update

注意: FOR UPDATE操作对表是加行独占锁,只影响SELECT选中的行。

select owner from dba_tables where table_name='表名';

用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。

如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。

1:对返回结果集进行update或delete操作会发生阻塞。

2:对该表进行ddl操作将会报:Ora-00054:resource busy and acquire with nowait specified.

原因分析

此时Oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操作都必须等待这个锁的释放,产生的外在现象就是其他的操作将发生阻塞,这个这个操作commit或rollback.

同样这个查询的事务将会对该表加(DML操作的)表级锁,不允许对该表的任何ddl操作,否则将会报出ora-00054错误::resource busy and acquire with nowait specified.

附加:表级锁是用于防止表的结构的修改。