如何使用jk触发器程序实现c实现级守护,防止DDL操作

下次自動登錄
現在的位置:
& 綜合 & 正文
如何使用觸發器實現資料庫級守護,防止DDL操作
如何使用觸發器實現資料庫級守護,防止DDL操作
--對於重要對象,實施DDL拒絕,防止create,drop,truncate,alter等重要操作
Last Updated: Sunday,
不管是有意還是無意的,你可能會遇到資料庫中重要的數據表等對象被drop掉的情況,這可能會給我們帶來巨大的損失.
通過觸發器,我們可以實現對於表等對象的資料庫級守護,禁止用戶drop操作.
以下是一個簡單的範例,供參考:
REM this script can be used to monitor a object
REM deny any drop operation on it.
CREATE OR REPLACE TRIGGER trg_dropdeny
BEFORE DROP ON DATABASE
IF LOWER (ora_dict_obj_name ()) = 'test'
raise_application_error (num
=& -20000,
'你瘋了,想刪除表 '
|| ora_dict_obj_name ()
|| ' ?!!!!!'
|| '你完了,警察已在途中.....'
SQL& connect scott/tiger
Connected.
SQL& create table test as select * from dba_
Table created.
SQL& connect / as sysdba
Connected.
SQL& create or replace trigger trg_dropdeny
before drop on database
if lower(ora_dict_obj_name()) = 'test'
raise_application_error(
num =& -20000,
msg =& '你瘋了,想刪除表 ' || ora_dict_obj_name() || ' ?!!!!!' ||'你完了,警察已在途中.....');
Trigger created.
SQL& connect scott/tiger
Connected.
drop table test
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20000: 你瘋了,想刪除表 TEST ?!!!!!你完了,警察已在途中.....
ORA-06512: at line 4
Oracle從Oracle8i開始,允許實施DDL事件trigger,可是實現對於DDL的監視及控制,以下是一個進一步的例子:
create or replace trigger ddl_deny
before create or alter or drop or truncate on database
l_errmsg varchar2(100):= 'You have no permission to this operation';
if ora_sysevent = 'CREATE' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
elsif ora_sysevent = 'ALTER' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
elsif ora_sysevent = 'DROP' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
elsif ora_sysevent = 'TRUNCATE' then
raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
when no_data_found then
我們看一下效果:
[oracle@jumper tools]$ sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.4.0 - Production on Sun Oct 31 11:38:25 2004
Copyright (c) , Oracle Corporation. All rights reserved.
Connected to:Oracle9i Enterprise Edition Release 9.2.0.4.0 - ProductionWith the Partitioning optionJServer Release 9.2.0.4.0 - Production
SQL& set echo onSQL& @ddltSQL& create or replace trigger ddl_deny2 before create or alter or drop or truncate on database3 declare4 l_errmsg varchar2(100):= 'You have no permission to this operation';5 begin6 if ora_sysevent = 'CREATE' then7 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);8 elsif ora_sysevent = 'ALTER' then9 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);10 elsif ora_sysevent = 'DROP' then11 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);12 elsif ora_sysevent = 'TRUNCATE' then13 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);1415 16 exception17 when no_data_found then181920 /
Trigger created.
SQL& SQL& SQL& connect scott/tigerConnected.SQL& create table t as select *create table t as select * from test*ERROR at line 1:ORA-00604: error occurred at recursive SQL level 1ORA-20001: SCOTT.T You have no permission to this operationORA-06512: at line 5
SQL& alter table test add (id number);alter table test add (id number)*ERROR at line 1:ORA-00604: error occurred at recursive SQL level 1ORA-20001: SCOTT.TEST You have no permission to this operationORA-06512: at line 7
SQL&drop table test*ERROR at line 1:ORA-00604: error occurred at recursive SQL level 1ORA-20001: SCOTT.TEST You have no permission to this operationORA-06512: at line 9
SQL&truncate table test*ERROR at line 1:ORA-00604: error occurred at recursive SQL level 1ORA-20001: SCOTT.TEST You have no permission to this operationORA-06512: at line 11
我們可以看到,ddl語句都被禁止了,如果你不是禁止,可以選擇把執行這些操作的用戶及時間記錄到另外的臨時表中.以備查詢.
本文作者:eygle,Oracle技術關注者,來自中國最大的Oracle技術論壇.是作者的個人站點.你可通過來聯繫作者.歡迎技術探討交流以及鏈接交換.
http://www.eygle.com/faq/Use.Trigger.To.implement.ddl.deny.htm
如欲轉載,請註明作者與出處.並請保留本文的連接.
【上篇】【下篇】服务热线:400-702-1168 ()
您好,访客
||||||||||
如何使用触发器实现数据库级守护,防止DDL操作-数据库专栏,SQL Server
发布时间: 21:45:56&&来源:&&作者:&&点击:487
&&&& 如何使用触发器实现数据库级守护,防止ddl操作--对于重要对象,实施ddl拒绝,防止create,drop,truncate,alter等重要操作last updated: sunday,
12:06 eygle && &&&不管是有意还是无意的,你可能会遇到数据库中重要的数据表等对象被drop掉的情况,这可能会给我们带来巨大的损失.通过触发器,我们可以实现对于表等对象的数据库级守护,禁止用户drop操作.以下是一个简单的范例,供参考:rem this script can be used to monitor a objectrem deny any drop operation on it.create or replace trigger trg_dropdeny
before drop on databasebegin
if lower (ora_dict_obj_name ()) = test
raise_application_error (num
=& -20000,
你疯了,想删除表
|| ora_dict_obj_name ()
|| 你完了,警察已在途中.....
测试效果:&sql& connect scott/tigerconnected.sql& create table test as select * from dba_table created.sql& connect / as sysdbaconnected.sql& create or replace trigger trg_dropdeny
before drop on database
if lower(ora_dict_obj_name()) = test
raise_application_error(
num =& -20000,
msg =& 你疯了,想删除表
|| ora_dict_obj_name() ||
?!!!!! ||你完了,警察已在途中.....);
/trigger created.sql& connect scott/tigerconnected.sql&drop table test*error at line 1:ora-00604: error occurred at recursive sql level 1ora-20000: 你疯了,想删除表 test ?!!!!!你完了,警察已在途中.....ora-06512: at line 4
&oracle从oracle8i开始,允许实施ddl事件trigger,可是实现对于ddl的监视及控制,以下是一个进一步的例子:create or replace trigger ddl_denybefore create or alter or drop or truncate on databasedeclare
l_errmsg varchar2(100):= you have no permissibegin
if ora_sysevent = create then
raise_application_error(-20001, ora_dict_obj_owner || . || ora_dict_obj_name ||
|| l_errmsg);
elsif ora_sysevent = alter then
raise_application_error(-20001, ora_dict_obj_owner || . || ora_dict_obj_name ||
|| l_errmsg);
elsif ora_sysevent = drop then
raise_application_error(-20001, ora_dict_obj_owner || . || ora_dict_obj_name ||
|| l_errmsg);
elsif ora_sysevent = truncate then
raise_application_error(-20001, ora_dict_obj_owner || . || ora_dict_obj_name ||
|| l_errmsg);exception
when no_data_/
&我们看一下效果:[oracle@jumper tools]$ sqlplus "/ as sysdba"sql*plus: release Array.2.0.4.0 - production on sun oct 31 11:38:25 2004copyright (c) 1Array82, 2002, oracle corporation. all rights reserved.connected to:oracleArrayi enterprise edition release Array.2.0.4.0 - productionwith the partitioning optionjserver release Array.2.0.4.0 - productionsql& set echo onsql& @ddltsql& create or replace trigger ddl_deny2 before create or alter or drop or truncate on database3 declare4 l_errmsg varchar2(100):= you have no permissi5 begin6 if ora_sysevent = create then7 raise_application_error(-20001, ora_dict_obj_owner || . || ora_dict_obj_name ||
|| l_errmsg);8 elsif ora_sysevent = alter thenArray raise_application_error(-20001, ora_dict_obj_owner || . || ora_dict_obj_name ||
|| l_errmsg);10 elsif ora_sysevent = drop then11 raise_application_error(-20001, ora_dict_obj_owner || . || ora_dict_obj_name ||
|| l_errmsg);12 elsif ora_sysevent = truncate then13 raise_application_error(-20001, ora_dict_obj_owner || . || ora_dict_obj_name ||
|| l_errmsg);1415 16 exception17 when no_data_found then181A20 /trigger created.sql& sql& sql& connect scott/tigerconnected.sql& create table t as select *create table t as select * from test*error at line 1:ora-00604: error occurred at recursive sql level 1ora-20001: scott.t you have no permission to this operationora-06512: at line 5sql& alter table test add (id number);alter table test add (id number)*error at line 1:ora-00604: error occurred at recursive sql level 1ora-20001: scott.test you have no permission to this operationora-06512: at line 7sql&drop table test*error at line 1:ora-00604: error occurred at recursive sql level 1ora-20001: scott.test you have no permission to this operationora-06512: at line Arraysql&truncate table test*error at line 1:ora-00604: error occurred at recursive sql level 1ora-20001: scott.test you have no permission to this operationora-06512: at line 11&
我们可以看到,ddl语句都被禁止了,如果你不是禁止,可以选择把执行这些操作的用户及时间记录到另外的临时表中.以备查询.&&&本文作者:eygle,oracle技术关注者,来自中国最大的oracle技术论坛itpub.www.eygle.com是作者的个人站点.你可通过guoqiang.来联系作者.欢迎技术探讨交流以及链接交换.原文出处:http://www.eygle.com/faq/use.trigger.to.implement.ddl.deny.htm&如欲转载,请注明作者与出处.并请保留本文的连接.回首页&
以上内容由
搜集整理,如转载请注明原文出处,并保留这一部分内容。
  “华夏名网” http://www.sudu.cn 和 http://www.bigwww.com 是成都飞数科技有限公司的网络服务品牌,专业经营虚拟主机,域名注册,VPS,服务器租用业务。公司创建于2002年,经过6年的高速发展,“华夏名网”已经成为我国一家知名的互联网服务提供商,被国外权威机构webhosting.info评价为十大IDC服务商之一。
华夏名网网址导航:
上一篇:下一篇:
(4915次点击) (2768次点击) (4158次点击) (2793次点击) (2369次点击) (3727次点击) (3568次点击) (2358次点击) (2528次点击) (2438次点击)
(3415次点击) (3233次点击) (3244次点击) (3989次点击) (2408次点击) (2320次点击) (3211次点击) (3619次点击) (2352次点击) (2334次点击)
& SUDU.CN 飞数科技 版权所有
电话总机:028-91 94
公司地址:四川省成都市青龙街51号倍特康派大厦10楼5号拒绝访问 | www.wangchao.net.cn | 百度云加速
请打开cookies.
此网站 (www.wangchao.net.cn) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(af4cea-ua98).
重新安装浏览器,或使用别的浏览器Posts - 150,
Articles - 12,
Comments - 1249
(SQL Server & MySQL) DBA
13:44 by 听风吹雨, ... 阅读,
一.本文所涉及的内容(Contents)
二.背景(Contexts)
  说到触发器,大家都会想到这样的使用场景:当一个表的数据修改了,运用DML触发插入或者更新到其它表中;那DDL触发器(SQL Server 2005引入的新功能)会运用到什么场景中呢?本文将为你讲述4种运用DDL触发器的场景:
  1) 禁止用户修改和删除表;
  2) 禁止用户删除数据库;
  3) 记录和监控某数据库所有的DDL操作;
  4) 把DDL操作信息以邮件的形式主动发送通知和预警;
三.基础知识(Rudimentary Knowledge)
  DDL触发器是由修改数据库对象的 DDL 语句(如以 CREATE、ALTER 或 DROP)激发。
  DDL触发器支持BEFORE和AFTER事件触发器,并在数据库或模式级运行。通常,DDL触发器用于监控数据库中的重要事件。有时用它们来监控错误代码。错误代码可能会执行破坏数据库或使数据库不稳定的活动。更常见的情况是:在开发、测试和stage系统中用它们来了解和监控数据库活动的动态。
  当监控GRANT和REVOKE权限语句时,它们也是有效的安全工具。
四.DDL运用场景(DDL Scene)
(一) 首先我们来看一个简单的例子:创建数据库DDL_DB和一个名为DatabaseLog的表,现在创建一个DDL触发器:禁止用户修改和删除表,并进行提醒。执行下面的SQL脚本进行测试。
--Script1:
--创建测试数据库
USE MASTER
CREATE DATABASE DDL_DB
--创建DDL触发器记录表
USE DDL_DB
CREATE TABLE [dbo].[DatabaseLog](
[DatabaseLogID] [int] IDENTITY(1,1) NOT NULL,
[PostTime] [datetime] NOT NULL,
[ServerName] [sysname] NOT NULL,
[LoginName] [sysname] NOT NULL,
[DatabaseUser] [sysname] NOT NULL,
[DatabaseName] [sysname] NOT NULL,
[Schema] [sysname] NULL,
[Object] [sysname] NULL,
[TSQL] [nvarchar](max) NOT NULL,
[Event] [sysname] NOT NULL,
[XmlEvent] [xml] NOT NULL,
CONSTRAINT [PK_DatabaseLog_DatabaseLogID] PRIMARY KEY NONCLUSTERED
[DatabaseLogID] ASC
) ON [PRIMARY]
) ON [PRIMARY]
--Script2:
--创建DDL触发器:禁止修改或者删除数据表
CREATE TRIGGER DDL_TableTrigger
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
PRINT '对不起,您不能对数据表进行操作,请联系DBA'
ROLLBACK ;
--测试删除表
USE DDL_DB
DROP TABLE [DatabaseLog]
(Figure1:创建数据库级别的DDL)
(Figure2:返回的提示信息)
(Figure3:SSMS返回的提示信息)
创建数据库级别的DDL之后会出现在数据库触发器列表中,如Figure1;当执行删除表的Drop等DDL命令的时候,就会出现Figure2的提示信息;如果是在SSMS中删除表则会出现Figure3的提示信息。
(二) 在上面的基础上再进行扩展,创建一个DDL触发器:禁止用户删除数据库,并进行提醒。
--Script3:
--禁止SQL Server服务器里删除数据库
CREATE TRIGGER DDL_DataBaseTrigger
ON ALL SERVER
FOR DROP_DATABASE
PRINT '对不起,您不能删除数据库,请联系DBA'
--测试删除数据库
USE MASTER
DROP DATABASE [DDL_DB]
(Figure4:创建服务器级别的DDL)
(Figure5:返回的提示信息)
(Figure6:SSMS返回的提示信息)
创建服务器级别的DDL之后会出现在服务器对象-触发器的列表中,如Figure4;当执行删除数据库的Drop等DDL命令的时候,就会出现Figure5的提示信息;如果是在SSMS中删除数据库则会出现Figure6的提示信息。
(三) 很多时候在程序开发阶段是不会禁用对数据库的修改的,这些时候我们更希望是记录数据库的修改信息,方便对信息进行跟踪检查。使用 EVENTDATA 函数,可以捕获有关激发 DDL 触发器的事件的信息,此函数返回 xml 值。
前面已经创建了数据表DatabaseLog,创建下面的DDL_DatabaseLog触发器,每当数据库发生DDL事件,DDL触发器就会把相关的DDL信息插入到DatabaseLog表,信息包括操作的时间,操作人,操作的SQL等。
执行Script5测试脚本,返回Figure7的信息,查询DatabaseLog表,返回的记录有2条,一条是创建表信息,一条是删除表信息,如Figure8、Figure9所示。
--Script4:
--创建当前数据库的DDL触发器
USE DDL_DB
-- =============================================
-- Author:
&听风吹雨&
-- Create date:
-- Description:
&记录数据库DDL操作&
&http://www.cnblogs.com/gaizai/&
-- =============================================
CREATE TRIGGER [DDL_DatabaseLog]
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS AS
SET NOCOUNT ON;
DECLARE @data XML;
DECLARE @schema
DECLARE @object
DECLARE @eventType
SET @data = EVENTDATA();
SET @eventType = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'sysname');
SET @schema = @data.value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname');
SET @object = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname')
IF @object IS NOT NULL
' + @eventType + ' - ' + @schema + '.' + @object;
' + @eventType + ' - ' + @schema;
IF @eventType IS NULL
PRINT CONVERT(nvarchar(max), @data);
INSERT [DDL_DB].[dbo].[DatabaseLog](
[PostTime],
[ServerName],
[LoginName],
[DatabaseUser],
[DatabaseName],
[XmlEvent])
GETDATE(),
@data.value('(/EVENT_INSTANCE/ServerName)[1]', 'sysname'),
@data.value('(/EVENT_INSTANCE/LoginName)[1]', 'sysname'),
CONVERT(sysname, CURRENT_USER),
@data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'sysname'),
CONVERT(sysname, @schema),
CONVERT(sysname, @object),
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)'),
@eventType,
--Script5:测试DDL记录
--禁用DDL 触发器
DISABLE TRIGGER DDL_TableTrigger ON DATABASE;
CREATE TABLE TestTable (a int)
DROP TABLE TestT
SELECT * FROM [DatabaseLog];
(Figure7:返回的提示信息)
(Figure8:DatabaseLog表前半部分信息)
(Figure9:DatabaseLog表后半部分信息)
(四) 我们可以使用DDL触发器主动监控DDL语句的执行,当有对数据库执行DDL就会触发,我们把这些信息保存到表中,并且把操作用户的HostName和修改的T-SQL以邮件的形式发送到指定的邮件。关于设置数据库邮件可以参考:。发送邮件的效果如Figure10。邮件部分参考:
--Script5:
--创建当前数据库的DDL触发器
USE DDL_DB
-- =============================================
-- Author:
&听风吹雨&
-- Create date:
-- Description:
&记录数据库DDL操作,发送邮件预警&
&http://www.cnblogs.com/gaizai/&
-- =============================================
CREATE TRIGGER [DDL_DatabaseLog]
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS AS
SET NOCOUNT ON;
DECLARE @data XML;
DECLARE @schema
DECLARE @object
DECLARE @eventType
DECLARE @databaseName
DECLARE @tableHTML
NVARCHAR(MAX);
SET @data = EVENTDATA();
SET @eventType = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'sysname');
SET @schema = @data.value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname');
SET @object = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname');
SET @databaseName = @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'sysname');
IF @object IS NOT NULL
' + @eventType + ' - ' + @schema + '.' + @object;
' + @eventType + ' - ' + @schema;
IF @eventType IS NULL
PRINT CONVERT(nvarchar(max), @data);
INSERT [DDL_DB].[dbo].[DatabaseLog](
[PostTime],
[ServerName],
[LoginName],
[DatabaseUser],
[DatabaseName],
[XmlEvent])
GETDATE(),
@data.value('(/EVENT_INSTANCE/ServerName)[1]', 'sysname'),
@data.value('(/EVENT_INSTANCE/LoginName)[1]', 'sysname'),
CONVERT(sysname, CURRENT_USER),
@databaseName,
CONVERT(sysname, @schema),
CONVERT(sysname, @object),
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)'),
@eventType,
SET @tableHTML =
N'&H1&DDL Event&/H1&' +
N'&table border="0"&' +
N'&tr&&th&PostTime&/th&&th&ServerName&/th&&th&LoginName&/th&&th&DatabaseUser&/th&&th&DatabaseName&/th&&th&Object&/th&' +
N'&th&TSQL&/th&&/tr&' +
CAST((SELECT
td = [PostTime],'',
td = [ServerName],'',
td = [LoginName],'',
td = [DatabaseUser],'',
td = [DatabaseName],'',
td = [Object],'',
td = TSQL,''
FROM [DDL_DB].[dbo].[DatabaseLog]
WHERE DatabaseLogID =(SELECT MAX(DatabaseLogID) FROM [DDL_DB].[dbo].[DatabaseLog])
FOR XML PATH('tr'), TYPE) AS NVARCHAR(MAX)) +
N'&/table&';
DECLARE @subjectStr
NVARCHAR(MAX);
SET @subjectStr = 'DDL Event - DataBaseName: ' + @databaseName;
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'DataBase_DDL_Event',
@recipients='',
@subject = @subjectStr,
@body = @tableHTML,
@body_format = 'HTML';
(Figure10:邮件收到的预警)
五.补充说明(Addon)
(一) 关于DML、DDL、DCL、TCL的解释:
DML is abbreviation of Data Manipulation Language. It is used to retrieve, store, modify, delete, insert and update data in database.
Examples: SELECT, UPDATE, INSERT statements
DDL is abbreviation of Data Definition Language. It is used to create and modify the structure of database objects in database.
Examples: CREATE, ALTER, DROP statements
DCL is abbreviation of Data Control Language. It is used to create roles, permissions, and referential integrity as well it is used to control access to database by securing it.
Examples: GRANT, REVOKE statements
TCL is abbreviation of Transactional Control Language. It is used to manage different transactions occurring within a database.
Examples: COMMIT, ROLLBACK statements
(二) 关于DML与DDL运用场景的一些区别:
DML 触发器可以看作是一种特殊的存储过程,可以保证系统保持其完整性,在系统中进行级联更新或强行业务规则。通过INSERTED 和 DELETED ,我们可以检索哪些列被更新了。DML触发器的本质就是当这两个发生数据修改时自动运行的存储过程。
DDL 触发器的构建主要是为了安全,或者根据部门的需求对系统所进行的变更进行通报。通过使用 EVENTDATA( ) 函数,可以在触发器中使用XML信息。
(三) 如果是线上的系统,可以考虑做下面的限制:在工作时间,不允许修改任何存储过程,否则回滚,示例代码如下:IF DATEPART(hour, GETDATE()) &=9 AND DATEPART(hour, GETDATE()) &= 17
(四) 一些维护DDL的SQL脚本:
--启用DDL 触发器
ENABLE TRIGGER DDL_TableTrigger ON DATABASE;
--禁用DDL 触发器
DISABLE TRIGGER ddlDatabaseTriggerLog ON DATABASE;
--删除DDL 触发器
DROP TRIGGER ddlDatabaseTriggerLog ON DATABASE;
--禁用当前数据库中所有数据库级别的DDL 触发器
DISABLE TRIGGER ALL ON DATABASE
--禁用服务器实例中所有服务器级别的DDL 触发器
DISABLE TRIGGER ALL ON ALL SERVER
(五) 所有的DDL事件可以查看,也可以通过下面的SQL进行查看:
--获取有关DDL 触发器可触发的事件或事件组的信息
SELECT * FROM sys.trigger_event_types
--查看触发器的依赖关系
SELECT * FROM sys.sql_expression_dependencies
SELECT * FROM sys.dm_sql_referenced_entities
SELECT * FROM sys.dm_sql_referencing_entities
--获取有关数据库范围内的触发器的信息
SELECT * FROM sys.triggers
--获取有关激发触发器的数据库事件的信息
SELECT * FROM sys.trigger_events
SELECT * FROM sys.trigger_events AS a
LEFT join sys.triggers AS b
ON a.object_id=b.object_id
WHERE name = 'ddlDatabaseTriggerLog'
--获取有关服务器范围内的触发器的信息
SELECT * FROM sys.server_triggers
SELECT * FROM sys.server_trigger_events
--查看数据库范围内的触发器的定义
SELECT * FROM sys.sql_modules
(六) 在执行Script3的时候如果你正在使用SSMS打开这个数据库(SPID)的话,那有可能不是出现Figure5的错误信息,而是出现Figure11的错误,这是因为你没有关闭SPID这些窗口,我还没有在程序连接的情况测试是否会返回这些信息:
(Figure11:Figure5可能出现的)
(七) 如果你想修改DDL触发器的内容,那么你不能直接Alter DDL,而应该是先执行Drop DDL,之后在Create DDL。
(八) 之前已经创建了DDL_TableTrigger和DDL_DatabaseLog触发器,这两个触发器都是在DDL_DB数据库中创建的,当我们需要修改DDL触发器,应该触发对象从小到大进行修改,即DDL_TableTrigger(表)到DDL_DatabaseLog(数据库)进行修改。
如Figure12所示,如果只修改DDL_TableTrigger(Drop、Create),再执行下面的脚本将会出现Figure13的错误(还没找到官方理论描述)。解决办法就是对DDL_DatabaseLog进行创建创建(Drop、Create)。
--测试删除表
USE MASTER
DROP DATABASE [DDL_DB]
(Figure12:DDL触发器列表)
(Figure13:错误信息)
七.疑问(Questions)
(一) 删除DDL触发器是否也可以触发一个事件呢?不然如何防止用户先删除DDL触发器之后再做DDL操作呢?难道是用户权限?
解答:第一种方法,可以对DDL触发器进行权限控制;第二种方式就是在服务器级别加一个DROP的触发器,可以监控各个数据库的DDL触发器;下图Figure14是DDL_DatabaseLog被删除时的预警;
(Figure14:删除DDL触发器)
(二) 能对所有数据库进行DDL监控?一条DDL预警能实现?
解答:可以在DDL_DatabaseLog把 ON DATABASE 设置为ON All SERVER,这样就可以监控整个服务器实例,下图Figure15是Logon_DB的DDL预警;
(Figure15:删除DDL触发器)
八.参考文献(References)
(邮件通知)

我要回帖

更多关于 d触发器实现计数器 的文章

 

随机推荐