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 存储过程名
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
这个执行的时候错误好多啊
#8
ding
#9
这个是oracle
#10
這個是Oracle數據庫的代碼.
#11
學習.
#12
事件查看器
#13
要用事件查看器
#14
学习
#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 存储过程名
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
这个执行的时候错误好多啊
#8
ding
#9
这个是oracle
#10
這個是Oracle數據庫的代碼.
#11
學習.
#12
事件查看器
#13
要用事件查看器
#14
学习
#15
#16
学习到了,在MySQl语句中也能进行吗?