ORACLE怎么增加一个触发器,当表 table_name 有进行增删改时,栏位Sesion =0的时候,获取到执行的程序,如程序为PLSQL.EXE执行时,进行报错不允许使用当前程序进行操作
时间: 2024-09-10 07:04:54 浏览: 50
在Oracle数据库中,你可以创建一个DDL (Data Definition Language) 触发器来实现这样的功能。触发器会在特定的数据修改操作(INSERT, UPDATE, DELETE)发生时自动执行。以下是创建一个满足条件的触发器的基本步骤:
```sql
CREATE OR REPLACE TRIGGER trigger_name
AFTER INSERT OR UPDATE OR DELETE ON table_name
FOR EACH ROW
BEGIN
IF NEW.Sesion = 0 THEN
-- 检查执行的程序是否为PLSQL.EXE
IF INSTR(SUBSTRING(SYS_CONTEXT('USERENV', 'SESSION_PROGRAM'), 'PLSQL.EXE') > 0 THEN
RAISE_APPLICATION_ERROR(-20001, 'Error: Operation not allowed with the current program.');
END IF;
END IF;
END;
/
```
这个触发器会在`table_name`表上执行,每当有一行数据插入、更新或删除时,会检查`Sesion`字段是否为0。如果等于0,并且检测到执行的程序包含"PLSQL.EXE"字样,就会引发一个自定义错误。
相关问题
ORACLE怎么增加一个触发器,当表有进行增删改时,获取到执行的程序,如程序为PLSQL.EXE执行时,进行报错不允许使用当前程序进行操作
在Oracle数据库中,你可以创建一个DDL触发器(DML触发器针对数据修改,DDL触发器针对数据定义的改变),用于在特定操作发生时执行自定义逻辑。为了达到你的需求,即在发现尝试使用的PL/SQL.exe程序出错时阻止操作,可以按照以下步骤创建一个触发器:
1. 首先,确保你有足够的权限执行此操作,通常需要DBA权限。
2. 使用CREATE TRIGGER语句创建触发器,例如:
```sql
CREATE OR REPLACE TRIGGER trg_program_error
BEFORE INSERT OR UPDATE OR DELETE ON your_table_name
FOR EACH ROW
BEGIN
IF EXISTS (SELECT * FROM V$SESSION WHERE SERIAL# = Sesion_ID AND USER_NAME = 'current_username' AND PROGRAM LIKE '%plsql.exe%')
THEN
SIGNAL SQLSTATE '45000'
WHENEVER SQLERROR
SET MESSAGE_TEXT = '操作已禁止,因为正在使用禁止的程序PL/SQL.exe';
END IF;
END;
/
```
请注意,你需要将`your_table_name`替换为目标表的实际名称,并根据需要调整`current_username`和`plsql.exe`部分。
3. 上述触发器会在INSERT、UPDATE或DELETE操作前检查是否由指定用户使用了PL/SQL.exe。如果检测到,则抛出一个错误并停止操作。
oracle数据库对用户u3授予 create sesion ,create table权限
在Oracle数据库中,你可以使用GRANT语句来给用户U3分配特定的权限,如`CREATE SESSION`和`CREATE TABLE`。这两个权限分别对应着:
1. `CREATE SESSION`:这个权限允许用户创建新的会话(也称为 sessions 或 connections)。在Oracle中,会话是连接到数据库并执行SQL语句的活动实例。
2. `CREATE TABLE`:此权限则允许用户创建新的表,即设计数据结构,并可以在数据库中添加新的实体。
以下是向用户U3授予这两个权限的SQL命令示例:
```sql
GRANT CREATE SESSION TO USER U3; -- 授予创建会话权限
GRANT CREATE TABLE TO USER U3; -- 授予创建表权限
-- 可能需要在特定的模式下授予权限,如果是这样,则加上模式名:
GRANT CREATE SESSION TO USER U3 IDENTIFIED BY password PASSWORD EXPIRE; -- 指定密码及过期时间
GRANT CREATE TABLE ON schema_name.table_space_name TO USER U3; -- 如果是在特定模式下的指定表空间
-- 确认权限已授予:
SELECT * FROM dba_users WHERE username = 'U3'; -- 查看用户的当前权限状态
```
请注意,实际操作时需要替换`password`为你想要设置的实际密码,以及`schema_name`和`table_space_name`为你需要限制权限的具体模式和表空间名称。执行此类操作时应谨慎,因为不当的权限配置可能会导致安全风险。
阅读全文