查询oracle不存在触发器的表
时间: 2023-09-03 22:16:39 浏览: 95
您可以使用以下 SQL 查询来查找 Oracle 数据库中不存在触发器的表:
```
SELECT table_name
FROM all_tables
WHERE owner = [owner_name]
AND table_name NOT IN (
SELECT table_name
FROM all_triggers
WHERE owner = [owner_name]
);
```
请将 `[owner_name]` 替换为您要查询的表的所有者名称。这将返回所有不存在触发器的表的名称。
相关问题
Oracle怎么写触发器
在 Oracle 数据库中,触发器的语法格式为:
```
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
[FOR EACH ROW]
[ENABLE/DISABLE]
[WHEN condition]
DECLARE
-- 触发器操作,可以使用 PL/SQL 语言编写
BEGIN
-- 触发器操作,可以使用 PL/SQL 语言编写
END;
```
其中,`OR REPLACE` 关键字表示如果同名的触发器已经存在,则替换它;`BEFORE` 或 `AFTER` 关键字用于指定触发器是在执行 DML 操作前还是后触发;`INSERT`、`UPDATE` 或 `DELETE` 关键字用于指定触发器是在哪种 DML 操作时触发;`table_name` 是要对其触发器进行定义的表名;`FOR EACH ROW` 关键字表示这是一个行级触发器,每次 DML 操作都会对每一行数据都触发一次;`ENABLE/DISABLE` 关键字表示触发器是否启用;`WHEN condition` 关键字表示触发器执行的条件,可选项。
以下是一个简单的 Oracle 触发器示例,当在 `employees` 表中插入一条记录时,会自动向 `logs` 表中插入一条日志记录:
```
CREATE OR REPLACE TRIGGER insert_employee_log
AFTER INSERT ON employees
FOR EACH ROW
DECLARE
emp_name employees.name%TYPE;
BEGIN
emp_name := :new.name;
INSERT INTO logs (log_time, log_message) VALUES (SYSDATE, 'A new employee was inserted. Name: ' || emp_name);
END;
```
在这个例子中,触发器的名称是 `insert_employee_log`,触发时间是 `AFTER INSERT`,操作的表名是 `employees`,触发器主体使用 `INSERT INTO` 语句向 `logs` 表中插入了一条日志记录。`:new` 是一个特殊的关键字,用于获取插入操作中的新数据行。`SYSDATE` 是一个系统函数,用于获取当前日期和时间。
Oracle数据库对触发器执行alter操作需要什么权限
在Oracle数据库中,对触发器执行ALTER操作需要相应的表的ALTER权限或者触发器的ALTER权限。具体而言,如果想要修改已经存在的触发器的定义,需要对该触发器所在的表具有ALTER权限或者对该触发器具有ALTER权限。
需要注意的是,如果触发器所在的表是另一个用户模式下的表,那么执行ALTER操作的用户需要对该用户模式下的表具有ALTER权限或者对该触发器具有ALTER权限。
此外,如果修改的是触发器中的PL/SQL代码,那么执行ALTER操作的用户还需要对相应的PL/SQL对象具有访问权限。例如,如果修改的是触发器中调用的存储过程,那么执行ALTER操作的用户需要对该存储过程具有执行权限。
阅读全文