精华内容
下载资源
问答
  • 创建DDL触发器

    千次阅读 2016-12-22 17:48:40
    转自 :... 创建用户并授权 #需要使用sys用户授权 CREATE USER DBADMIN IDENTIFIED BY DBADMIN; GRANT CONNECT TO DBADMIN; GRANT DBA TO DBADMIN; GRANT SYS.V_$OPEN_CURS

    转自 :http://blog.csdn.net/jaune161/article/details/47300697

    创建用户并授权

    create or replace trigger tr_ddl
      before ddl on database
    declare
      l_errmsg varchar2(100) := '请按照公司流程进行申请';
    begin
      if (Ora_dict_obj_type = 'TABLE' or Ora_dict_obj_type = 'INDEX' or
         Ora_dict_obj_type = 'PROCEDURE' or Ora_dict_obj_type = 'TRIGGER') AND
         ora_login_user not in ('SYS', 'SYSTEM') and
         (Ora_sysevent = 'ALTER' OR Ora_sysevent = 'DROP' OR
         Ora_sysevent = 'CREATE') then
        raise_application_error(-20001,
                                ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' ||
                                l_errmsg);
      end if;
    
    
    exception
      when no_data_found then
        null;
    end;
    
    #需要使用sys用户授权
    CREATE USER DBADMIN IDENTIFIED BY DBADMIN;
    
    GRANT CONNECT TO DBADMIN;
    GRANT DBA TO DBADMIN;
    GRANT SYS.V_$OPEN_CURSOR TO DBADMIN;

    创建序列及表

    DROP SEQUENCE SEQ_DDL_VERSION;
    CREATE SEQUENCE SEQ_DDL_VERSION INCREMENT BY 1 START WITH 1 NOMAXVALUE NOMINVALUE NOCYCLE NOCACHE;
    
    DROP TABLE TB_SYSTEM_DDL_LOGS CASCADE CONSTRAINTS;
    
    /*==============================================================*/
    /* TABLE: TB_SYSTEM_DDL_LOGS                                    */
    /*==============================================================*/
    CREATE TABLE TB_SYSTEM_DDL_LOGS 
    (
       EVENT_ID             VARCHAR2(32)         DEFAULT SYS_GUID() NOT NULL,
       EVENT_NAME           VARCHAR2(20),
       TERMINAL             VARCHAR2(50),
       DB_NAME              VARCHAR2(50),
       OBJECT_NAME          VARCHAR2(30),
       OBJECT_NAME_LIST     VARCHAR(300),
       OBJECT_OWNER         VARCHAR2(30),
       OBJECT_TYPE          VARCHAR2(20),
       IS_ALTER_COLUMN      VARCHAR(10),
       IS_DROP_COLUMN       VARCHAR(10),
       SQL_ID               VARCHAR(13),
       SQL_TEXT             CLOB,
       CURRENT_USER         VARCHAR(30),
       CURRENT_USERID       NUMBER,
       SESSION_USER         VARCHAR(10),
       SESSION_USERID       NUMBER,
       PROXY_USER           VARCHAR(30),
       PROXY_USERID         NUMBER,
       CURRENT_SCHEMA       VARCHAR(30),
       HOST                 VARCHAR(100),
       OS_USER              VARCHAR(60),
       IP_ADDRESS           VARCHAR(32),
       DDL_TIME             DATE                 DEFAULT SYSDATE,
       SESSION_ID           VARCHAR(32),
       VERSION_NO           NUMBER,
       CONSTRAINT PK_TB_SYSTEM_DDL_LOGS PRIMARY KEY (EVENT_ID)
    );
    
    
    COMMENT ON TABLE TB_SYSTEM_DDL_LOGS IS '【数据库日志】DDL日志表';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.EVENT_ID IS '事件ID自动生成';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.EVENT_NAME IS '事件名称';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.TERMINAL IS '客户端操作系统终端的名称';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.DB_NAME IS '数据库名称';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.OBJECT_NAME IS 'DDL发生的对象名称';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.OBJECT_NAME_LIST IS '对象列表';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.OBJECT_OWNER IS
    'DDL发生对象的宿主';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.OBJECT_TYPE IS
    '对象类别';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.IS_ALTER_COLUMN IS
    '当列被修改的时候为真,否则为假 ';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.IS_DROP_COLUMN IS
    '当列被DROP的时候为真,否则为假 ';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.SQL_ID IS
    'SQL_ID';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.SQL_TEXT IS
    'SQL语句';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.CURRENT_USER IS
    '当前SESSION拥有权限的用户的名称(比如说当前SESSION是SYS,但是正在执行system.myproc,那么current_user就是system)';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.CURRENT_USERID IS
    '当前SESSION拥有的权限的用户的ID';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.SESSION_USER IS
    'session所属的用户名';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.SESSION_USERID IS
    '当前SESSION所属的用户id';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.PROXY_USER IS
    '打开当前SESSION的用户的名称';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.PROXY_USERID IS
    '打开当前SESSION的用户的ID';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.CURRENT_SCHEMA IS
    '当前SESSION缺省的SCHEMA名称,可以用SESSION SET CURRENT_SCHEMA语句修改';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.HOST IS
    '客户端的主机名称';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.OS_USER IS
    '客户端的操作系统用户名';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.IP_ADDRESS IS
    '客户端的IP地址';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.DDL_TIME IS
    '修改时间';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.SESSION_ID IS
    'SESSION_ID';
    
    
    COMMENT ON COLUMN TB_SYSTEM_DDL_LOGS.VERSION_NO IS
    '版本号';
    
    

    序列的作用主要是为了标识DDL操作版本,采用的是一种类似与SVN版本控制的方式,每发生一次变化版本号就加一

    表是用来存储变更记录的

    创建触发器

    CREATE OR REPLACE TRIGGER TRIG_MONITOR_SYSTEM_DDL AFTER DDL ON DATABASE /**  * 创建时间:2014年7月1日09:49:02  * 描述:监控DDL操作并将DDL操作及DDL语句记录到日志表中  */ DECLARE       PRAGMA AUTONOMOUS_TRANSACTION;       TR_EVENT_ID VARCHAR2(32);       TR_TERMINAL VARCHAR2(50);       TR_IPADDR VARCHAR2(30);       TR_CUR_USER VARCHAR2(30);       TR_CUR_USERID NUMBER;       TR_SE_USER VARCHAR2(30);       TR_SE_USERID NUMBER;       TR_PROXY_USER VARCHAR2(30);       TR_PROXY_USERID NUMBER;       TR_CUR_SC VARCHAR2(30);       TR_HOST VARCHAR2(100);       TR_OS_USER VARCHAR2(60);       TR_SESSIONID VARCHAR2(32);       TR_SQL_ID VARCHAR2(13);       TR_SQL VARCHAR2(60);       TR_VERSION_NO NUMBER;       TR_N NUMBER;       TR_STMT CLOB := NULL;       TR_SQL_TEXT ORA_NAME_LIST_T; BEGIN   TR_EVENT_ID := SYS_GUID();       --获取用户信息       SELECT NVL(SYS_CONTEXT('USERENV','TERMINAL'),''),--客户端操作系统终端的名称              NVL(SYS_CONTEXT('USERENV','IP_ADDRESS'),''),--客户端操作系统终端的名称              NVL(SYS_CONTEXT('USERENV','CURRENT_USER'),''),--当前SESSION拥有权限的用户的名称(比如说当前SESSION是SYS,但是正在执行SYSTEM.MYPROC,那么CURRENT_USER就是SYSTEM)              NVL(SYS_CONTEXT('USERENV','CURRENT_USERID'),''),--当前SESSION拥有的权限的用户的ID              NVL(SYS_CONTEXT('USERENV','SESSION_USER'),''),--SESSION所属的用户名              NVL(SYS_CONTEXT('USERENV','SESSION_USERID'),''),--当前SESSION所属的用户ID              NVL(SYS_CONTEXT('USERENV','PROXY_USER'),''),--打开当前SESSION的用户的名称              NVL(SYS_CONTEXT('USERENV','PROXY_USERID'),''),--打开当前SESSION的用户的ID              NVL(SYS_CONTEXT('USERENV','CURRENT_SCHEMA'),''),--当前SESSION缺省的SCHEMA名称              NVL(SYS_CONTEXT('USERENV','HOST'),''),--客户端的主机名称              NVL(SYS_CONTEXT('USERENV','OS_USER'),''),--客户端的操作系统用户名              NVL(SYS_CONTEXT('USERENV','SESSIONID'),'')--SESSION的ID       INTO TR_TERMINAL,TR_IPADDR,TR_CUR_USER,TR_CUR_USERID,TR_SE_USER,TR_SE_USERID,TR_PROXY_USER,TR_PROXY_USERID,            TR_CUR_SC,TR_HOST,TR_OS_USER,TR_SESSIONID       FROM DUAL;       --获取DDL SQL语句,如果语句过长无法全部获得,可以根据SQL_ID查询       BEGIN         SELECT SQL_TEXT,SQL_ID INTO TR_SQL,TR_SQL_ID            FROM V$OPEN_CURSOR            WHERE UPPER(SQL_TEXT) LIKE 'ALTER%'                  OR UPPER(SQL_TEXT) LIKE 'CREATE%'                  OR UPPER(SQL_TEXT) LIKE 'DROP%';            TR_N := ORA_SQL_TXT(TR_SQL_TEXT);            FOR I IN 1 .. TR_N LOOP              TR_STMT := TR_STMT || TR_SQL_TEXT(I);            END LOOP;           EXCEPTION WHEN OTHERS THEN            TR_SQL_ID := NULL;            TR_STMT := NULL;       END; --向TB_SYSTEM_DDL_LOGS日志表中插入DDL操作记录       IF ORA_SYSEVENT <> 'TRUNCATE' AND ORA_DICT_OBJ_NAME NOT LIKE 'SYS_C%' THEN         SELECT SEQ_DDL_VERSION.NEXTVAL INTO TR_VERSION_NO FROM DUAL;         INSERT INTO TB_SYSTEM_DDL_LOGS               (EVENT_ID,EVENT_NAME,TERMINAL,DB_NAME,OBJECT_NAME,OBJECT_OWNER,OBJECT_TYPE,               IS_ALTER_COLUMN,IS_DROP_COLUMN,SQL_ID,SQL_TEXT,SESSION_ID,               CURRENT_USER,CURRENT_USERID,SESSION_USER,SESSION_USERID,               PROXY_USER,PROXY_USERID,CURRENT_SCHEMA,HOST,OS_USER,IP_ADDRESS,VERSION_NO)         VALUES (TR_EVENT_ID,ORA_SYSEVENT,TR_TERMINAL,ORA_DATABASE_NAME,ORA_DICT_OBJ_NAME,ORA_DICT_OBJ_OWNER,ORA_DICT_OBJ_TYPE,               NULL,NULL,TR_SQL_ID,TR_STMT,TR_SESSIONID,               TR_CUR_USER,TR_CUR_USERID,TR_SE_USER,TR_SE_USERID,               TR_PROXY_USER,TR_PROXY_USERID,TR_CUR_SC,TR_HOST,TR_OS_USER,TR_IPADDR,TR_VERSION_NO         );         COMMIT;       END IF; END;

    展开全文
  • 利用DDL类型的触发器... 例 创建DDL触发器。 要求拒绝创建表,并做出相关提示。 use AdventureWorks go IF EXISTS (SELECT * FROM sys.triggers WHERE name='trg_reftable') DROP TRIGGER trg_reftable ON DATA...

        利用DDL类型的触发器可以限制和记录特定的DDL操作。例如通过DDL触发器可以限制对数据库结构的修改,记录数据库中的更改事件,也可以在修改对象的时候根据实际情况做出必需的响应动作
        例    创建DDL触发器。    要求拒绝创建表,并做出相关提示。

    use AdventureWorks
    go
    
    IF EXISTS (SELECT * FROM sys.triggers WHERE name='trg_reftable')
    DROP TRIGGER trg_reftable
    ON DATABASE;
    GO
    
    CREATE TRIGGER trg_reftable
    ON DATABASE
    FOR CREATE_TABLE
    AS
      RAISERROR ('AdventureWorks数据库禁止创建表!',10,1)
      ROLLBACK
    GO
    

    验证触发器
    执行创建表的操作,用于验证触发器是否正常激发

    CREATE TABLE  treftest(reftest nchar(10) NULL)
    ON [PRIMARY]
    GO


     

    展开全文
  • SQL创建DDL触发器

    千次阅读 2019-02-08 20:52:16
    如果要执行以下操作,可以使用DDL触发器: 防止对数据库架构进行更改 希望数据库中发生某些情况以响应数据库架构中的更改 要记录数据库架构中的更改或事件 USE [XXHIS_KF] GO /****** Object: DdlTrigger [DDL...

    当服务器或数据库中发生数据定义语言(DDL)事件时将被调用。如CREATE,ALTER,DROP等操作。如果要执行以下操作,可以使用DDL触发器:

    防止对数据库架构进行更改
    希望数据库中发生某些情况以响应数据库架构中的更改
    要记录数据库架构中的更改或事件

    USE [XXHIS_KF]
    GO

    /****** Object: DdlTrigger [DDL_LOG] Script Date: 09/12/2017 20:31:28 ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    create trigger [DDL_LOG] on database
    for DDL_DATABASE_LEVEL_EVENTS
    as
    begin
    set nocount on;
    declare @EventTxt xml,@EventType varchar(50)=’’,@Parame varchar(50)=’’,
    @SchemaName varchar(30)=’’,@ObjType varchar(50)=’’,
    @ObjName varchar(100)=’’,@SqlText varchar(max)=’’,
    @SqlTexts varchar(max)=’’,@SText varchar(max)=’’;
    set @EventTxt=eventdata();

    ;with tab as(
    select
    @EventTxt as xmls
    )
    select
    @EventType= xmls.value(’(/EVENT_INSTANCE/EventType)[1]’ ,‘varchar(50)’ ) ,
    @SchemaName=xmls.value(’(/EVENT_INSTANCE/SchemaName)[1]’ ,‘varchar(30)’ ) ,
    @ObjType= xmls.value(’(/EVENT_INSTANCE/ObjectType)[1]’ ,‘varchar(50)’ ) ,
    @ObjName= xmls.value(’(/EVENT_INSTANCE/ObjectName)[1]’ ,‘varchar(100)’) ,
    @Parame = xmls.value(’(/EVENT_INSTANCE/Parameters)[1]’ ,‘varchar(100)’) ,
    @SqlText=xmls.value(’(/EVENT_INSTANCE/TSQLCommand)[1]’,‘varchar(max)’)
    from tab;
    if @ObjName in(‘Proc_Version_Script’,‘DDL_RenameTrigger’,‘DDL_RenameTrigger’)
    begin
    –set @ObjName=‘不能对’+@ObjName+‘对象进行操作’;
    – RAISERROR (@ObjName, 16,1);
    –Proc_Version_Script
    return;
    end;
    if @EventType in(‘Create_View’ ,‘Alter_View’ ,‘Drop_View’,
    ‘Create_Trigger’ ,‘Alter_Trigger’ ,‘Drop_Trigger’,
    ‘Create_Table’ ,‘alter_table’ ,‘Drop_Table’,
    ‘Create_Function’ ,‘Alter_Function’ ,‘Drop_Function’,
    ‘Create_Procedure’ ,‘Alter_Procedure’ ,‘Drop_procedure’,
    ‘Create_Synonym’ ,‘Drop_Synonym’,
    ‘CREATE_INDEX’ ,‘ALTER_INDEX’ ,‘DROP_INDEX’
    )
    insert into DDL_LOG
    (EventType,SchemaName,ObjType,ObjName,ExecDate,Terminal)
    select @EventType,@SchemaName,@ObjType,@ObjName,SYSDATETIME(),host_name();
    end;

    GO

    SET ANSI_NULLS OFF
    GO

    SET QUOTED_IDENTIFIER OFF
    GO

    DISABLE TRIGGER [DDL_LOG] ON DATABASE
    GO

    ENABLE TRIGGER [DDL_LOG] ON DATABASE
    GO

    展开全文
  • 创建记录表drop table ddl_log_qiang purge;create table ddl_log_qiang(operation varchar2(50), 什么操作obj...
  • SQL Server DDL 触发器(Trigger)-- 创建服务器级别的DDL触发器若是创建服务器级别的DDL触发器,只要把先前的ON DATABASE改为ON ALL SERVER,即可跟踪服务器级别的事件,使用的原理与数据库级别的DDL触发器相似,...
  • SQL Server DDL 触发器(Trigger)-- 创建数据库级别的DDL触发器以下针对某个数据库在创建数据表时调用触发器,并将创建该数据表的用户账户写入到Windows的Event Log中。CREATETRIGGERreminder ONDATABASE FORCREATE...
  • 什么是ddl(data definition ...n 创建ddl触发器 请编写一个触发器,可以记录某个用户进行的ddl操作 基本语法: create or replace trigger 触发器名 after ddl on 方案名.sche...
  • 利用Oracle DDL触发器实现DDL监控

    千次阅读 2015-08-05 17:31:23
    前言创建此触发器的主要目的是为了控制数据库的版本,虽然会将DDL语句保留但难免会出现遗漏,所以创建DDl触发器记录DDL操作,主要是用来核对数据库变更的SQL语句创建用户并授权
  • 今天应客户需求,需要对用户 A 下面的表,用户 B 只能够查询,更新,插入的权限, A 用户的过程和包,B用户只能够执行, 同时 C用户只能查询A用户的表, 由于 A 用户的表在不断增加,所以想到了创建DDL触发器 ...
  • DDL触发器,当执行DDL语句时会被触发。按照作用范围,分为schema triggers,database triggers。... 创建DDL触发器 要创建一个DDL触发器,语法如下: 1 CREATE [OR REPLACE] TRIGGER trigger name...
  • DDL触发器原理 DDL 触发器用于响应各种数据定义语言 (DDL) 事件。这些事件主要与以关键字 CREATE、ALTER、DROP、GRANT、DENY、REVOKE 或 UPDATE STATISTICS 开头的Transact-SQL语句对应。执行 DDL 式操作的系统存储...
  • SQL Server DDL触发器

    2018-10-19 20:43:00
    DDL 触发器创建用来监视并响应该数据库或服务器实例中的活动的事件通知时,可以指定相应事件类型或事件组。 超链接:DDL 事件和DDL 事件组 DDL 触发器类别: DDL 触发器分为:数据库(DataBase)级别和服务器...
  • 上一篇博客中有提到:触发器分为DML触发器和DDL触发器两种。以下是对这两种触发器的介绍和具体操作分析☟☟ DML触发器 具体语法: CREATE TRIGGER trigger_name ON {table | view} { {{FOR | AFTER | INSTEAD ...
  •  通过创建DDL触发器,记录数据库对象的增删改的操作,能够在数据库出现问题时,便于跟踪、定位问题。本文通过实例介绍了如何使用DDL触发器。  使用 EVENTDATA 函数,可以捕获有关激发 DDL 触发器的事件的信息...
  • DDL触发器的应用

    2016-05-05 17:23:09
    一般来说,DML触发器可以监测得到具体对象的具体数据的变更。...首先我们做一个监控创建表的触发器,DDL触发器,一个关键点是在于 EVENTDATA() 这个函数提供的信息。 CREATE TRIGGER TR_CreateTable ON ALL
  • DDL触发器就是一些特有的 DDL 语句的触发器。 例如:登陆到服务器的触发, 创建数据库的触发。 DML 触发器是当数据库服务器中发生数据操作语言 (DML) 事件时要执行的操作。DML 事件包括对表或视图发出的 UPDATE、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 530
精华内容 212
关键字:

创建ddl触发器