精华内容
下载资源
问答
  • 主要介绍了使用sqlplus创建DDL和DML操作方法,需要的朋友可以参考下
  • 主要介绍了使用sqlplus创建DDL和DML操作技巧,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • 使用MinGW gcc 创建DDL和调用DDL 使用 gcc 编译生成 ddl 文件所会使用到的 gcc 命令 选项 解释 -Wall 生成所有警告信息 -o FILENAME 生成指定的输出文件,用在生成可执行文件时。 -shared 生成共享目标...

    使用MinGW gcc 创建DDL和调用DDL

    使用 gcc 编译生成 ddl 文件所会使用到的 gcc 命令

    选项 解释
    -Wall 生成所有警告信息
    -o FILENAME 生成指定的输出文件,用在生成可执行文件时。
    -shared 生成共享目标文件。通常用在建立共享库时。
    -c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件,会生成 .0 文件
    -S 只激活预处理和编译,就是指把文件编译成为汇编代码,会生成 .s 文件

    创建动态链接库(.ddl文件)

    隐式调用法


    1.先创建一个测试文件夹

    在这里插入图片描述

    2.在测试文件夹中创建一个 <20171426.h>

    /*
     * author : snowflake
     * date : 2019/09/04
     */
    #ifndef _20171426_H_
    #define _20171426_H_
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    extern __declspec (dllexport) void sayHello();
    
    #ifdef __cplusplus
    }
    #endif
    
    
    #endif // ~_MY_DLL_H_
    

    3.在测试文件夹中创建一个 <20171426.c>

    #include <stdio.h>
    
    void sayHello() {
    
        printf("%s", "小颖最可爱啦!!!");
    
    }
    

    4.创建一个测试文件 <test.c>

    #include <stdio.h>
    #include "20171426.h"
    
    int main() {
    
        sayHello();
        return 0;
    }
    

    5.目录结构如下

    在这里插入图片描述

    按住 shift 键,右击鼠标会出现 在此处打Powershell 窗口

    执行

    gcc -Wall -shared 20171426.c -o 20171426.dll
    

    或者

    gcc --shared 20171426.c -o 20171426.dll
    

    会生成一个 20171426.dll 文件

    在这里插入图片描述

    接着编译 test.c 文件

    /*
     * gcc 是一个工具,小颖可以理解为 javac 进行编译
     * test.c 是测试源文件
     * 20171426.dll 是动态链接库文件,代表编译 test.c 文件时要用到 20171426.dll 链接库
     * -o 暂时不知道
     * test 生成的可执行文件名
     */
    gcc test.c 20171426.dll -o test
    

    会生成一个 test.exe 可执行文件

    在这里插入图片描述

    然后在控制台输入 .\test 即可执行

    在这里插入图片描述

    动态链接库

    Java 调用动态链接库

    • 工具:IDEA
    • C语言编译工具:MinGW GCC
    • JDK 版本:1.8

    创建 Java 工程

    在这里插入图片描述

    创建 JNI.java 文件

    package xyz.snowflake.jni;
    
    import org.junit.Test;
    
    /**
     * @author snowflake
     * @create-date 2019-09-04 12:07
     */
    public class JNI {
    
        public native void sayHello();
    
    }
    

    在这里插入图片描述

    构建工程,为了生成 out 文件夹

    在这里插入图片描述

    使用如下命令

    javac
    -h
    $ContentRoot$\jni
    -d
    $ContentRoot$\out\production\$ModuleName$
    $FileDir$\$FileName$
    

    执行后,会生成 <全类名(包名+类名)> + “.h” 头文件

    本例中

    javac
    -h E:\Learning-records\大三上学期\计算机操作系统\dll\jni
    -d E:\Learning-records\大三上学期\计算机操作系统\dll\out\production\dll
    E:\Learning-records\大三上学期\计算机操作系统\dll\src\xyz\snowflake\jni\JNI.java
    

    现在项目结构如下

    在这里插入图片描述

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class xyz_snowflake_jni_JNI */
    
    #ifndef _Included_xyz_snowflake_jni_JNI
    #define _Included_xyz_snowflake_jni_JNI
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     xyz_snowflake_jni_JNI
     * Method:    sayHello
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_xyz_snowflake_jni_JNI_sayHello
      (JNIEnv *, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    

    然后实现头文件中定义的方法

    JNI.c

    #include <jni.h>
    #include <stdio.h>
    #include "xyz_snowflake_jni_JNI.h"
    
    JNIEXPORT void JNICALL Java_xyz_snowflake_jni_JNI_sayHello(JNIEnv *env, jobject thisObj) {
       printf("%s", "Hello World!\n");
       return;
    }
    

    在这里插入图片描述

    执行

    gcc
    -Wl,--kill-at
    -I "$JDKPath$\include"
    -I "$JDKPath$\include\win32"
    -shared
    $ContentRoot$\jni\$FileNameWithoutAllExtensions$.c
    -o
    $ContentRoot$\lib\$FileNameWithoutAllExtensions$.dll
    

    本例中是

    D:\MinGW\bin\gcc.exe
    -Wl,--kill-at
    -I "C:\Program Files\Java\jdk-10.0.2\include"
    -I "C:\Program Files\Java\jdk-10.0.2\include\win32"
    -shared E:\Learning-records\大三上学期\计算机操作系统\dll\jni\JNI.c
    -o E:\Learning-records\大三上学期\计算机操作系统\dll\lib\JNI.dll
    

    生成 JNI.dll 文件后的目录结构

    在这里插入图片描述

    然后创建测试类

    package xyz.snowflake.jni;
    
    /**
     * @author snowflake
     * @create-date 2019-09-05 21:15
     */
    public class JNITest {
    
        static {
            System.loadLibrary("JNI");
        }
    
        public static void main(String[] args) {
            JNI jni = new JNI();
            jni.sayHello();
        }
    
    }
    

    此时项目结构如下

    在这里插入图片描述

    进行测试

    会报如下错误

    java.lang.UnsatisfiedLinkError: no JNI in java.library.path: [...]
    	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2654)
    	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:876)
    	at java.base/java.lang.System.loadLibrary(System.java:1875)
    	at xyz.snowflake.jni.JNITest.<clinit>(JNITest.java:10)
    Exception in thread "main"
    

    解决方法

    编辑配置,配置 VM

    -Djava.library.path=<lib文件夹路径名,也就是 dll 文件所在的文件夹>

    在这里插入图片描述

    但是运行由会报如下的错误

    java.lang.UnsatisfiedLinkError: E:\Learning-records\大三上学期\计算机操作系统\dll\lib\JNI.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
    	at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
    	at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2424)
    	at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2481)
    	at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2678)
    	at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2643)
    	at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:876)
    	at java.base/java.lang.System.loadLibrary(System.java:1875)
    	at xyz.snowflake.jni.JNITest.<clinit>(JNITest.java:10)
    Exception in thread "main"
    

    解决方案,使用 X86 版本 的 JDK

    我将 JDK 版本更换为 JDK1.8 X86 版本后,运行结果正常

    在这里插入图片描述

    结果如下

    在这里插入图片描述

    自己遇到的其他的错误


    错误

    ����: �Ҳ������޷��������� semester
    ԭ��: java.lang.ClassNotFoundException: semester
    

    不知道什么原因

    错误

    ����: �Ҳ������޷��������� semester
    

    不知道什么原因

    错误

    Exception in thread "main" java.lang.UnsupportedClassVersionError: xyz/snowflake/jni/JNI has been compiled by a more recent version of the Java Runtime (class file version 54.0), this version of the Java Runtime only recognizes class file versions up to 52.0
    	at java.lang.ClassLoader.defineClass1(Native Method)
    	at java.lang.ClassLoader.defineClass(Unknown Source)
    	at java.security.SecureClassLoader.defineClass(Unknown Source)
    	at java.net.URLClassLoader.defineClass(Unknown Source)
    	at java.net.URLClassLoader.access$100(Unknown Source)
    	at java.net.URLClassLoader$1.run(Unknown Source)
    	at java.net.URLClassLoader$1.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.net.URLClassLoader.findClass(Unknown Source)
    	at java.lang.ClassLoader.loadClass(Unknown Source)
    	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    	at java.lang.ClassLoader.loadClass(Unknown Source)
    	at java.lang.Class.forName0(Native Method)
    	at java.lang.Class.forName(Unknown Source)
    	at com.intellij.junit4.JUnit4TestRunnerUtil.loadTestClass(JUnit4TestRunnerUtil.java:316)
    	at com.intellij.junit4.JUnit4TestRunnerUtil.buildRequest(JUnit4TestRunnerUtil.java:147)
    	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:46)
    	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
    

    解决方法

    更换 JDK 版本一致

    参考文章

    https://www.cnblogs.com/lichmama/p/4126323.html
    https://www.xuebuyuan.com/1528987.html

    展开全文
  • 利用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)事件时将被调用。如CREATE,ALTER,DROP等操作。如果要执行以下操作,可以使用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

    展开全文
  • 创建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;

    展开全文
  • 1.连接数据库在window进入命令行模式敲sqlplus就会然后进行表的DDL操作例如:在进行DML操作:你可以对刚才建立的模式进行数据的插入和数据的更新操作例如数据的插入**这里要注意的是:** 如果你出先如下错误解决方法...
  • 小编典典将数据从数据库导出为sqlLiquiBase是一个开源(LGPL),独立...为给定的JPA实体生成创建和删除脚本我们使用以下代码生成drop和create语句:只需使用所有实体类构造该类,然后调用create / dropTableScript。如...
  • 然后进行表的DDL操作 例如: 在进行DML操作:你可以对刚才建立的模式进行数据的插入和数据的更新操作 例如数据的插入 ** 这里要注意的是: ** 如果你出先如下错误 解决方法:要在每一句结束是加上...
  • 一、什么是DDL和数据库事件触发器?DDL语句触发DDL触发器:CREATE,ALTER或DROP。...(1)在DDL语句中创建触发器语法•ON DATABASE在数据库中的所有模式上触发DDL•ON SCHEMA仅针对您自己的模式中的对象触发DDLCREA...
  • 创建记录表drop table ddl_log_qiang purge;create table ddl_log_qiang(operation varchar2(50), 什么操作obj...
  • 相应地,DDL操作运行时间长,占用系统资源,需要额外的磁盘空间(建立临时表),影响系统吞吐,并且一旦DDL过程中实例crash,恢复时间也会很久。以加列DDL为例,MySQL经历如下过程:1.以新schema建立空表。2.拷贝数据...
  • 今天应客户需求,需要对用户 A 下面的表,用户 B 只能够查询,更新,插入的权限, A 用户的过程和包,B用户只能够执行, 同时 C用户只能查询A用户的表, 由于 A 用户的表在不断增加,所以想到了创建DDL触发器 ...
  • DDL语句创建

    2021-04-17 17:42:11
    DDL语句(创建表) DDL创建表格式: CREATE TABLE 表名( 列名 数据类型 (约束) (DEFAULT 默认值), 列名 数据类型 (约束) (DEFAULT 默认值), 列名 数据类型 (约束) (DEFAULT 默认值) ); MySql常见...
  • 利用Oracle DDL触发器实现DDL监控

    千次阅读 2015-08-05 17:31:23
    前言创建此触发器的主要目的是为了控制数据库的版本,虽然会将DDL语句保留但难免会出现遗漏,所以创建DDl触发器记录DDL操作,主要是用来核对数据库变更的SQL语句创建用户并授权
  • DDL 创建与查询数据库

    2021-04-01 00:36:57
    DDL 创建与查询数据库 概念CRUD c,create r,retrieve u,update d,delete crud,增删改查 查询所有数据库的名称 information_schema 描述数据库的信息的 不是真正的表 没有实体文件 mysql 核心文件 有核心数据...
  • 1、创建表-创建表时可以添加完整性约束create table mytable --创建表(id int not null,name nchar(8) null,sex char(2))查看所有表:SHOW TABLES查询某一个表的具体信息:关键字:desc:desc 表名表中数据的数据...
  • create or replace trigger forbid_ddl before ddl on DATABASEbegin --if ora_dict_obj_owner = ora_login_user then -- return;-- end if; raise_application_error (-20000, '零一二三四五六七八九零一二三四五六...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,934
精华内容 4,373
关键字:

创建ddl