在触发器中获取当前执行的sql语句,以及类型

时间:2021-06-12 05:03:38
在触发器中获取当前执行的sql语句,以及类型(不包括系统执行的语句),获取当前的sql语句或者存储过程。

16 个解决方案

#1


前面有人问过,等高手,不太懂这个

#2


在事件探查器中获取

#3


用触发器不行,用事件探查器。SQL SERVER->事件探查器—>文件—>新建—>跟踪,输入用户名、密码 —> 出现跟踪属性窗体—> 常规选项页 ,(你可以设定事件或进行筛选,这样开起来好看些,或不用。)—> 运行 你就可以比如:打开你的客户端程序,执行对数据库的操作 ,在事件探查器会有一行一行的记录,你就可以看到对数据库操作的语句了。

#4



如何在触发器中捕获当前执行的SQL语句?
INSERT/UPDATE/DELETE触发器使用中,有没有办法得到触发本次事件的SQL语句。


捕获发出的dml语句的方法:
SQL> create table mon_sql(
username varchar2(30),
client_ip varchar2(100),
sql_text varchar2(4000),
table_name varchar2(30),
owner varchar2(30)
);

create or replace trigger tri_capt_dml_sql
BEFORE DELETE OR INSERT OR UPDATE ON EMP_TEMP
declare
n number; 
stmt varchar2(4000); 
sql_text ora_name_list_t; 
begin 
n := ora_sql_txt(sql_text); 
FOR i IN 1..n LOOP 
stmt := stmt || sql_text(i); 
END LOOP; 

insert into mon_sql(USERNAME, CLIENT_IP, SQL_TEXT, TABLE_NAME, OWNER) 
values(user,sys_context('userenv','ip_address'),stmt,'T1','RAINY'); 
end; 
/

禁止ddl操作
create or replace trigger ddl_deny
before create or alter or drop or truncate on database
declare
v_errmsg varchar2(100):= 'You have no permission to this operation';
begin
if ora_sysevent = 'CREATE' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || v_errmsg);
elsif ora_sysevent = 'ALTER' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || v_errmsg);
elsif ora_sysevent = 'DROP' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || v_errmsg);
elsif ora_sysevent = 'TRUNCATE' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || v_errmsg);
end if;

exception
when no_data_found then
null;
end;
/

审计ddl操作
create table event_table (text varchar(200));

CREATE OR REPLACE TRIGGER bef_alter 
BEFORE create or alter or drop or truncate ON DATABASE
DECLARE
sql_text ora_name_list_t;
stmt VARCHAR2(2000);
n number;
begin
INSERT INTO event_table VALUES ('Changed object is ' || ora_dict_obj_name);
n := ora_sql_txt(sql_text);
FOR i IN 1..n LOOP
stmt := stmt || sql_text(i);
END LOOP;
INSERT INTO event_table VALUES ('text of triggering statement: ' || stmt);
end;

#5


取当前的存储过程sql语句
exec sp_helptext 存储过程名

#6


--sql2005 ddl触发器可以做到,捕获激发触发器的 Transact-SQL 语句

create TRIGGER safety 
ON DATABASE 
FOR CREATE_TABLE 
AS 
    
    SELECT EVENTDATA().value
        ('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
 
;
GO
 
CREATE TABLE NewTable (Column1 int);
 
 --执行以上语句后返回如下结果

/*
CREATE TABLE NewTable (Column1 int);
*/

#7


引用 4 楼 fwacky 的回复:
SQL code
如何在触发器中捕获当前执行的SQL语句?INSERT/UPDATE/DELETE触发器使用中,有没有办法得到触发本次事件的SQL语句。


捕获发出的dml语句的方法:
SQL>createtable mon_sql(
usernamevarchar2(30),
client_ipvarchar2(100),
sql_textvarchar2(4000),
table_namev¡­



这个执行的时候错误好多啊

#8


ding

#9


引用 7 楼 bobui 的回复:
引用 4 楼 fwacky 的回复:
 SQL code
 如何在触发器中捕获当前执行的SQL语句?INSERT/UPDATE/DELETE触发器使用中,有没有办法得到触发本次事件的SQL语句。


 捕获发出的dml语句的方法:
 SQL>createtable mon_sql(
 usernamevarchar2(30),
 client_ipvarchar2(100),
 sql_textvarchar2(4000),
 table_namev¡­



 这个执行的时候错误好多啊
这个是oracle

#10


引用 7 楼 bobui 的回复:
引用 4 楼 fwacky 的回复:
SQL code
如何在触发器中捕获当前执行的SQL语句?INSERT/UPDATE/DELETE触发器使用中,有没有办法得到触发本次事件的SQL语句。


捕获发出的dml语句的方法:
SQL>createtable mon_sql(
usernamevarchar2(30),
client_ipvarchar2(100),
sql_textvarchar2(4000),
table_namev¡­



这个执行的时候错误好多啊

這個是Oracle數據庫的代碼.

#11


引用 6 楼 xiequan2 的回复:
SQL code--sql2005 ddl触发器可以做到,捕获激发触发器的 Transact-SQL 语句createTRIGGER safetyONDATABASEFOR CREATE_TABLEASSELECT EVENTDATA().value
        ('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
 ¡­

學習.

#12


事件查看器

#13


要用事件查看器

#14


学习

#15


好像回答过楼主的,  日志类触发器

用调用'DBCC INPUTBUFFER的方法记录了SQL语句,使用临时表,对速度有点影响,语句也只能得到前255个字符,这些是缺点,是否使用自己考虑

#16


学习到了,在MySQl语句中也能进行吗?

#1


前面有人问过,等高手,不太懂这个

#2


在事件探查器中获取

#3


用触发器不行,用事件探查器。SQL SERVER->事件探查器—>文件—>新建—>跟踪,输入用户名、密码 —> 出现跟踪属性窗体—> 常规选项页 ,(你可以设定事件或进行筛选,这样开起来好看些,或不用。)—> 运行 你就可以比如:打开你的客户端程序,执行对数据库的操作 ,在事件探查器会有一行一行的记录,你就可以看到对数据库操作的语句了。

#4



如何在触发器中捕获当前执行的SQL语句?
INSERT/UPDATE/DELETE触发器使用中,有没有办法得到触发本次事件的SQL语句。


捕获发出的dml语句的方法:
SQL> create table mon_sql(
username varchar2(30),
client_ip varchar2(100),
sql_text varchar2(4000),
table_name varchar2(30),
owner varchar2(30)
);

create or replace trigger tri_capt_dml_sql
BEFORE DELETE OR INSERT OR UPDATE ON EMP_TEMP
declare
n number; 
stmt varchar2(4000); 
sql_text ora_name_list_t; 
begin 
n := ora_sql_txt(sql_text); 
FOR i IN 1..n LOOP 
stmt := stmt || sql_text(i); 
END LOOP; 

insert into mon_sql(USERNAME, CLIENT_IP, SQL_TEXT, TABLE_NAME, OWNER) 
values(user,sys_context('userenv','ip_address'),stmt,'T1','RAINY'); 
end; 
/

禁止ddl操作
create or replace trigger ddl_deny
before create or alter or drop or truncate on database
declare
v_errmsg varchar2(100):= 'You have no permission to this operation';
begin
if ora_sysevent = 'CREATE' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || v_errmsg);
elsif ora_sysevent = 'ALTER' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || v_errmsg);
elsif ora_sysevent = 'DROP' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || v_errmsg);
elsif ora_sysevent = 'TRUNCATE' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || v_errmsg);
end if;

exception
when no_data_found then
null;
end;
/

审计ddl操作
create table event_table (text varchar(200));

CREATE OR REPLACE TRIGGER bef_alter 
BEFORE create or alter or drop or truncate ON DATABASE
DECLARE
sql_text ora_name_list_t;
stmt VARCHAR2(2000);
n number;
begin
INSERT INTO event_table VALUES ('Changed object is ' || ora_dict_obj_name);
n := ora_sql_txt(sql_text);
FOR i IN 1..n LOOP
stmt := stmt || sql_text(i);
END LOOP;
INSERT INTO event_table VALUES ('text of triggering statement: ' || stmt);
end;

#5


取当前的存储过程sql语句
exec sp_helptext 存储过程名

#6


--sql2005 ddl触发器可以做到,捕获激发触发器的 Transact-SQL 语句

create TRIGGER safety 
ON DATABASE 
FOR CREATE_TABLE 
AS 
    
    SELECT EVENTDATA().value
        ('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
 
;
GO
 
CREATE TABLE NewTable (Column1 int);
 
 --执行以上语句后返回如下结果

/*
CREATE TABLE NewTable (Column1 int);
*/

#7


引用 4 楼 fwacky 的回复:
SQL code
如何在触发器中捕获当前执行的SQL语句?INSERT/UPDATE/DELETE触发器使用中,有没有办法得到触发本次事件的SQL语句。


捕获发出的dml语句的方法:
SQL>createtable mon_sql(
usernamevarchar2(30),
client_ipvarchar2(100),
sql_textvarchar2(4000),
table_namev¡­



这个执行的时候错误好多啊

#8


ding

#9


引用 7 楼 bobui 的回复:
引用 4 楼 fwacky 的回复:
 SQL code
 如何在触发器中捕获当前执行的SQL语句?INSERT/UPDATE/DELETE触发器使用中,有没有办法得到触发本次事件的SQL语句。


 捕获发出的dml语句的方法:
 SQL>createtable mon_sql(
 usernamevarchar2(30),
 client_ipvarchar2(100),
 sql_textvarchar2(4000),
 table_namev¡­



 这个执行的时候错误好多啊
这个是oracle

#10


引用 7 楼 bobui 的回复:
引用 4 楼 fwacky 的回复:
SQL code
如何在触发器中捕获当前执行的SQL语句?INSERT/UPDATE/DELETE触发器使用中,有没有办法得到触发本次事件的SQL语句。


捕获发出的dml语句的方法:
SQL>createtable mon_sql(
usernamevarchar2(30),
client_ipvarchar2(100),
sql_textvarchar2(4000),
table_namev¡­



这个执行的时候错误好多啊

這個是Oracle數據庫的代碼.

#11


引用 6 楼 xiequan2 的回复:
SQL code--sql2005 ddl触发器可以做到,捕获激发触发器的 Transact-SQL 语句createTRIGGER safetyONDATABASEFOR CREATE_TABLEASSELECT EVENTDATA().value
        ('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
 ¡­

學習.

#12


事件查看器

#13


要用事件查看器

#14


学习

#15


好像回答过楼主的,  日志类触发器

用调用'DBCC INPUTBUFFER的方法记录了SQL语句,使用临时表,对速度有点影响,语句也只能得到前255个字符,这些是缺点,是否使用自己考虑

#16


学习到了,在MySQl语句中也能进行吗?