• SQL Server 触发器调用外部EXE 程序 Demo,将\KingdeeFeedList\KingdeeFeedList\bin\Debug文件夹下文件放置在 触发器调用位置
  • SQL Server 数据库 触发器 执行外部程序需要使用 master..xp_cmdshell 进行外部exe的执行 使用master..xp_cmdshell 需要先开启xp_cmdshell 直接执行开启命令 --开启xp_cmdshell: exec sp_configure 'show ...

    SQL Server 数据库 触发器 执行外部程序需要使用 master..xp_cmdshell 进行外部exe的执行

    使用master..xp_cmdshell 需要先开启xp_cmdshell

    直接执行开启命令

    --开启xp_cmdshell:
    exec sp_configure 'show advanced options', 1; 
    reconfigure; 
    exec sp_configure 'xp_cmdshell', 1; 
    reconfigure; 
    exec sp_configure 'show advanced options', 0; 
    reconfigure;
    
    --关闭xp_cmdshell:
    exec sp_configure 'show advanced options', 1; 
    reconfigure; 
    exec sp_configure 'xp_cmdshell', 0; 
    reconfigure; 
    exec sp_configure 'show advanced options', 0; 
    reconfigure;

    在触发器中调用

    @InterID为参数

    调用exe程序路径过长会无法调用

    触发器调用Demo地址

    https://download.csdn.net/download/qq_36773804/11123364

    展开全文
  • MySQL好像从5.0.2版本就开始支持触发器的功能了,本次博客就来介绍一下触发器,首先还是谈下概念性的东西吧:什么是触发器触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。...

    MySQL好像从5.0.2版本就开始支持触发器的功能了,本次博客就来介绍一下触发器,首先还是谈下概念性的东西吧:

    什么是触发器

    触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。

    举个例子,比如你现在有两个表【用户表】和【日志表】,当一个用户被创建的时候,就需要在日志表中插入创建的log日志,如果在不使用触发器的情况下,你需要编写程序语言逻辑才能实现,但是如果你定义了一个触发器,触发器的作用就是当你在用户表中插入一条数据的之后帮你在日志表中插入一条日志信息。当然触发器并不是只能进行插入操作,还能执行修改,删除。

    创建触发器

    创建触发器的语法如下:

    CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt
    trigger_name:触发器的名称
    tirgger_time:触发时机,为BEFORE或者AFTER
    trigger_event:触发事件,为INSERT、DELETE或者UPDATE
    tb_name:表示建立触发器的表明,就是在哪张表上建立触发器
    trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句
    所以可以说MySQL创建以下六种触发器:
    BEFORE INSERT,BEFORE DELETE,BEFORE UPDATE
    AFTER INSERT,AFTER DELETE,AFTER UPDATE

    其中,触发器名参数指要创建的触发器的名字

    BEFORE和AFTER参数指定了触发执行的时间,在事件之前或是之后

    FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器

    创建有多个执行语句的触发器
    CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
    ON 表名 FOR EACH ROW
    BEGIN
        执行语句列表
    END

    其中,BEGIN与END之间的执行语句列表参数表示需要执行的多个语句,不同语句用分号隔开

    tips:一般情况下,mysql默认是以 ; 作为结束执行语句,与触发器中需要的分行起冲突

         为解决此问题可用DELIMITER,如:DELIMITER ||,可以将结束符号变成||

         当触发器创建完成后,可以用DELIMITER ;来将结束符号变成;

    mysql> DELIMITER ||
    mysql> CREATE TRIGGER demo BEFORE DELETE
        -> ON users FOR EACH ROW
        -> BEGIN
        -> INSERT INTO logs VALUES(NOW());
        -> INSERT INTO logs VALUES(NOW());
        -> END
        -> ||
    Query OK, 0 rows affected (0.06 sec)
    
    mysql> DELIMITER ;

    上面的语句中,开头将结束符号定义为||,中间定义一个触发器,一旦有满足条件的删除操作

    就会执行BEGIN和END中的语句,接着使用||结束

    最后使用DELIMITER ; 将结束符号还原

    tigger_event:

     

    load data语句是将文件的内容插入到表中,相当于是insert语句,而replace语句在一般的情况下和insert差不多,但是如果表中存在primary 或者unique索引的时候,如果插入的数据和原来的primary key或者unique相同的时候,会删除原来的数据,然后增加一条新的数据,所以有的时候执行一条replace语句相当于执行了一条delete和insert语句。

    触发器可以是一条SQL语句,也可以是多条SQL代码块,那如何创建呢?

    DELIMITER $  #将语句的分隔符改为$
    BEGIN
    sql1;
    sql2;
    ...
    sqln
    END $
    DELIMITER ;  #将语句的分隔符改回原来的分号";"

    在BEGIN...END语句中也可以定义变量,但是只能在BEGIN...END内部使用:

    DECLARE var_name var_type [DEFAULT value] #定义变量,可指定默认值
    SET var_name = value  #给变量赋值

    NEW和OLD的使用:

     

     根据以上的表格,可以使用一下格式来使用相应的数据:

    NEW.columnname:新增行的某列数据
    OLD.columnname:删除行的某列数据

    说了这么多现在我们来创建一个触发器吧!

    案例1:

    现在有表如下:
    用户users表

    CREATE TABLE `users` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
      `add_time` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `name` (`name`(250)) USING BTREE
    ) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=latin1;

    日志logs表:

    CREATE TABLE `logs` (
      `Id` int(11) NOT NULL AUTO_INCREMENT,
      `log` varchar(255) DEFAULT NULL COMMENT '日志说明',
      PRIMARY KEY (`Id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日志表';

    需求是:当在users中插入一条数据,就会在logs中生成一条日志信息。

    创建触发器:

    DELIMITER $
    CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW
    BEGIN
    DECLARE s1 VARCHAR(40)character set utf8;
    DECLARE s2 VARCHAR(20) character set utf8;#后面发现中文字符编码出现乱码,这里设置字符集
    SET s2 = " is created";
    SET s1 = CONCAT(NEW.name,s2);     #函数CONCAT可以将字符串连接
    INSERT INTO logs(log) values(s1);
    END $
    DELIMITER ;

    这里我用的navicat: 

    案例2:创建触发器,记录表的增、删、改操作记录

    接下来将创建user和user_history表,以及三个触发器tri_insert_user、tri_update_user、tri_delete_user,分别对应user表的增、删、改三件事;

    • 创建user表;
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `account` varchar(255) DEFAULT NULL,
      `name` varchar(255) DEFAULT NULL,
      `address` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    • 创建对user表操作历史表;
    DROP TABLE IF EXISTS `user_history`;
    CREATE TABLE `user_history` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `user_id` bigint(20) NOT NULL,
      `operatetype` varchar(200) NOT NULL,
      `operatetime` datetime NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    • 创建user表插入事件对应的触发器tri_insert_user;

    几点说明:

    DELIMITER:改变输入的结束符,默认情况下输入结束符是分号;,这里把它改成了两个分号;;,这样做的目的是把多条含分号的语句做个封装,全部输入完之后一起执行,而不是一遇到默认的分号结束符就自动执行;

    new:当触发插入和更新事件时可用,指向的是被操作的记录

    old: 当触发删除和更新事件时可用,指向的是被操作的记录

    DROP TRIGGER IF EXISTS `tri_insert_user`;
    DELIMITER ;;
    CREATE TRIGGER `tri_insert_user` AFTER INSERT ON `user` FOR EACH ROW begin
        INSERT INTO user_history(user_id, operatetype, operatetime) VALUES (new.id, 'add a user',  now());
    end
    ;;
    DELIMITER ;
    • 创建user表更新事件对应的触发器tri_update_user;
    DROP TRIGGER IF EXISTS `tri_update_user`;
    DELIMITER ;;
    CREATE TRIGGER `tri_update_user` AFTER UPDATE ON `user` FOR EACH ROW begin
        INSERT INTO user_history(user_id,operatetype, operatetime) VALUES (new.id, 'update a user', now());
    end
    ;;
    DELIMITER ;
    • 创建user表删除事件对应的触发器tri_delete_user;
    DROP TRIGGER IF EXISTS `tri_delete_user`;
    DELIMITER ;;
    CREATE TRIGGER `tri_delete_user` AFTER DELETE ON `user` FOR EACH ROW begin
        INSERT INTO user_history(user_id, operatetype, operatetime) VALUES (old.id, 'delete a user', now());
    end
    ;;
    DELIMITER ;
    • 至此,全部表及触发器创建完成,开始验证结果,分别做插入、修改、删除事件,执行以下语句,观察user_history是否自动产生操作记录;
    INSERT INTO user(account, name, address) VALUES ('user1', 'user1', 'user1');
    INSERT INTO user(account, name, address) VALUES ('user2', 'user2', 'user2');
    
    UPDATE user SET name = 'user3', account = 'user3', address='user3' where name='user1';
    
    DELETE FROM `user` where name = 'user2';
    • 观察结果user表和user_history表的结果,操作记录已产生,说明触发器工作正常;

    查看触发器

    SHOW TRIGGERS语句查看触发器信息

    Tip:

    上面我用的navicat直接创建,如果大家用的mysql front,name这里会有个区别,我们删除刚才的触发器,在Mysql front中测试
    drop trigger  user_log;#删除触发器

    打开Mysql Front:

     

    mysql front在编译sql时,不用定义结尾分隔符,修改后的sql直接这样既可:

    #DELIMITER $
    CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW
    BEGIN
    DECLARE s1 VARCHAR(40)character set utf8;
    DECLARE s2 VARCHAR(20) character set utf8;
    SET s2 = " is created";
    SET s1 = CONCAT(NEW.name,s2);     #函数CONCAT可以将字符串连接
    INSERT INTO logs(log) values(s1);
    END #$
    #DELIMITER ;

    这里再啰嗦几句:

    tips:SHOW TRIGGERS语句无法查询指定的触发器

    在triggers表中查看触发器信息
    SELECT * FROM information_schema.triggers;

    结果显示了所有触发器的详细信息,同时,该方法可以查询制定触发器的详细信息

    SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='user_log';

    tips:所有触发器信息都存储在information_schema数据库下的triggers表中

         可以使用SELECT语句查询,如果触发器信息过多,最好通过TRIGGER_NAME字段指定查询

    回到上面,我们创建好了触发器,继续在users中插入数据并查看数据:

    insert into users(name,add_time) values('周伯通',now());

    好吧,我们再来查看一下logs表吧!

    通过上面的例子,可以看到只需要在users中插入用户的信息,日志会自动记录到logs表中,这也许就是触发器给我带来的便捷吧!

     

    限制和注意事项

    触发器会有以下两种限制:

    1.触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL语句,但是允许存储程序通过参数将数据返回触发程序,也就是存储过程或者函数通过OUT或者INOUT类型的参数将数据返回触发器是可以的,但是不能调用直接返回数据的过程。

    2.不能再触发器中使用以显示或隐式方式开始或结束事务的语句,如START TRANS-ACTION,COMMIT或ROLLBACK。

    注意事项:MySQL的触发器是按照BEFORE触发器、行操作、AFTER触发器的顺序执行的,其中任何一步发生错误都不会继续执行剩下的操作,如果对事务表进行的操作,如果出现错误,那么将会被回滚,如果是对非事务表进行操作,那么就无法回滚了,数据可能会出错。

     

    总结

    触发器是基于行触发的,所以删除、新增或者修改操作可能都会激活触发器,所以不要编写过于复杂的触发器,也不要增加过得的触发器,这样会对数据的插入、修改或者删除带来比较严重的影响,同时也会带来可移植性差的后果,所以在设计触发器的时候一定要有所考虑。

    触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。

    数据库触发器有以下的作用:

    1.安全性。可以基于数据库的值使用户具有操作数据库的某种权利。

      # 可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据。

      # 可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%。

    2.审计。可以跟踪用户对数据库的操作。   

      # 审计用户操作数据库的语句。

      # 把用户对数据库的更新写入审计表。

    3.实现复杂的数据完整性规则

      # 实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不同,触发器可以引用列或数据库对象。例如,触发器可回退任何企图吃进超过自己保证金的期货。

      # 提供可变的缺省值。

    4.实现复杂的非标准的数据库相关完整性规则。触发器可以对数据库中相关的表进行连环更新。例如,在auths表author_code列上的删除触发器可导致相应删除在其它表中的与之匹配的行。

      # 在修改或删除时级联修改或删除其它表中的与之匹配的行。

      # 在修改或删除时把其它表中的与之匹配的行设成NULL值。

      # 在修改或删除时把其它表中的与之匹配的行级联设成缺省值。

      # 触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。当插入一个与其主健不匹配的外部键时,这种触发器会起作用。例如,可以在books.author_code 列上生成一个插入触发器,如果新值与auths.author_code列中的某值不匹配时,插入被回退。

    5.同步实时地复制表中的数据。

    6.自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理。例如,如果公司的帐号上的资金低于5万元则立即给财务人员发送警告数据。


    转载自周伯通的麦田博客

    展开全文
  • /* Sqlserver数据库开始相关服务 以下示例显示了如何查看 OLE Automation Procedures 的当前设置。0未启用 */ EXEC sp_configure 'show advanced option', '1' --只有这个高级选项被打开的时候,才有权限修改...
    /*
    Sqlserver数据库开始相关服务
    以下示例显示了如何查看 OLE Automation Procedures 的当前设置。0未启用
    */
    EXEC sp_configure 'show advanced option', '1' --只有这个高级选项被打开的时候,才有权限修改其他配置。
    go 
    RECONFIGURE     --运行RECONFIGURE语句进行安装,也就是说,使以上语句生效
    go 
    EXEC sp_configure 'Ole Automation Procedures';
    GO
    
    --启用Ole Automation Procedures
    sp_configure 'show advanced options', 1;
    GO
    RECONFIGURE;
    GO
    sp_configure 'Ole Automation Procedures', 1;
    GO
    RECONFIGURE;
    GO
    
    
    ---通过sql server 2008 调用应用程序  
    CREATE PROCEDURE  [dbo].[pro_NotifyApp](
    	@Id NVARCHAR(20),
    	@Content NVARCHAR(MAX)
    )     
    AS  
    BEGIN  
    	declare @ServiceUrl as varchar(1000)   
      
    	 PRINT  'http://localhost:789/home/GetNotify?id=' + @Id + '&message=' + @Content 
    	--通过http协议调用的接口地址'   
    	set @ServiceUrl = 'http://localhost:789/home/GetNotify?id=' + @Id + '&message=' + @Content  
      
    	Declare @Object as Int  
    	Declare @ResponseText as Varchar(8000)  
      
    	Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;  
    	Exec sp_OAMethod @Object, 'open', NULL, 'get',@ServiceUrl,'false'  
    	Exec sp_OAMethod @Object, 'send'  
    	Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT  
      
    	Select @ResponseText       
    	Exec sp_OADestroy @Object  
    END 
    
    --在对应表上创建 更新触发器,监控数据是否有变化,变化即刻通知应用程序
    CREATE TRIGGER notify_trigger ON  [dbo].[TestTable]
       AFTER UPDATE 
    AS   
    BEGIN  
    	/*
    		update触发器会在更新数据后,
    		将更新前的数据保存在deleted表中,更
    		新后的数据保存在inserted表中。
    	*/
    	DECLARE @UpdateID NVARCHAR(20)
    	DECLARE @UpdateContent Varchar(MAX) 
        set @UpdateID=(select Deleted.D_Id from Deleted) 
        set @UpdateContent=(select Inserted.D_Amount from Inserted) 
    
        EXEC pro_NotifyApp @UpdateID, @UpdateContent
    END  
            //mvc项目  http://localhost:789/home/GetNotify
            public ActionResult GetNotify()
            {
                string id = Request["id"];
                string message = Request["message"];
                //插入数据
                string txt = string.Empty;
                var date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                txt = string.Format("{0} ID:{1} Message:{2}", date, id, message);
                FileStream fs = null;
                StreamWriter sw = null;
                try
                {
                    string path = "D:\\111.txt";//文件的路径,保证文件存在。
                    fs = new FileStream(path, FileMode.Append);
                    sw = new StreamWriter(fs);
                    sw.WriteLine(txt);
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    sw.Dispose();
                    sw.Close();
                    fs.Dispose();
                    fs.Close();
                }
                return null;
            }

     

    --测试
    /*触发器两个虚拟表,inserted 保存的是 insert 或 update 之后所影响的记录形成的表,
    deleted 保存的是 delete 或 update 之前所影响的记录形成的表。*/
    UPDATE dbo.TestTable SET  D_Amount=209 WHERE D_Id=5004

     

    转载于:https://www.cnblogs.com/zxh1919/p/10213001.html

    展开全文
  • 原文发布日期:2007.05.17 介绍我们一起来做个示例,在.NET中新建一个类,并在这个类里新建一个方法,然后在SQL Server中调用这个方法。... 这使得开发人员可以用任何CLR语言(如C#、VB.NET或C++等)来写存储过
    原文发布日期:2007.05.17
     


    介绍
    我们一起来做个示例,在.NET中新建一个类,并在这个类里新建一个方法,然后在SQL Server中调用这个方法。按照微软所述,通过宿主 Microsoft .NET Framework 2.0 公共语言运行库 (CLR),SQL Server 2005显著地增强了数据库编程模型。 这使得开发人员可以用任何CLR语言(如C#、VB.NET或C++等)来写存储过程、触发器和用户自定义函数。


    我们如何实现这些功能呢?
    为了使用CLR,我们需要做如下几步:
        1、在.NET中新建一个类,并在这个类里新建一个public方法。
        2、编译这个类为一个DLL。
        3、在SQL Server中注册这个DLL。
        4、新建一个SQL Server函数来访问指定的.NET方法。


    接下来,我们一起来完成一个示例
    首先,在Visual Studio中新建一个名为“SQLServerCLRTest”的类库项目。 然后,新建一个名为“CLRFunctions”的类,并在其内添加一个名为“HelloWold”的方法,代码如下:
    public class CLRFunctions 
    {
        
    public static string HelloWorld(string Name) 
        
    {
            
    return ("Hello " + Name);
        }

    }

    这是一个非常简单的方法(为了让SQL Server可以调用它,它必须要是public和static的),这个方法有一个string类型的参数,返回信息为“Hello”加上你传入的参数。

    现在,我们需要编译这个项目为一个DLL,并在SQL Server中注册它。 这也是比较简单的,在VS中右键单击项目,选择“生成”后程序就会生成一个DLL。 如果你的项目是调试模式的话,那么就可以在如下所示那样的路径里找到编译好的DLL。
    C:/Documents and Settings/mark.smith/My Documents/Visual Studio 2005/Projects/SQLServerCLRTest/SQLServerCLRTest/bin/Debug/SQLServerCLRTest.dll

    找到这个DLL后,我们就可以把它拷贝到我们的SQL Server机器上了,如果是相同机器的话我们只要记住这个路径即可。


    启用CLR功能
    默认情况下,SQL Server中的CLR是关闭的,所以我们需要执行如下命令打开CLR:
    exec sp_configure 'clr enabled',1   
    reconfigure   
    go 


    注册DLL
    为了调用我们写的那个方法,需要在SQL Server中注册我们刚刚编译好的那个DLL。 我们可以在数据库中使用如下命令来注册DLL(路径为你的DLL文件的路径)
    CREATE ASSEMBLY asmHelloWorld FROM 'C:/SQLServerCLRTest.dll'   


    在SQL Server中调用我们的.NET方法
    为了调用.NET方法,我们可以写一个SQL Server自定义函数,并在其内使用“EXTERNAL NAME”来通知SQL Server使用CLR功能。 代码如下:
    CREATE FUNCTION dbo.clrHelloWorld   
    (   
        
    @name as nvarchar(200)   
    )    
    RETURNS nvarchar(200)   
    AS EXTERNAL NAME asmHelloWorld.[SQLServerCLRTest.CLRFunctions].HelloWorld 

    上面的自定义函数做了两项工作。 首先是声明了一个nvarchar参数,它等同于.NET里的string类型(如果将其设置为varchar并且后面使用了“EXTERNAL NAME”的话就会报错)。然后使用“EXTERNAL NAME”来调用.NET方法。 语法如下:
    程序集名.类名.方法名

    但是,当我使用这个语法调用.NET方法的时候,SQL Server就会报错,所以为了让它正常工作,我使用了如下语法:
    程序集名.[类名].方法名

    现在我们就可以通过如下语句调用.NET方法了:
    SELECT dbo.clrHelloWorld('Mark')

    当你运行这段代码的时候,就会得到一个返回结果“Hello Mark”。


    我们通过一个很简单的示例演示了如何实现SQL Server的CLR,它可以给我们带来很多非常有用的帮助。 
    展开全文
  • sqlserver数据库触发器调用外部exe,同事可以选择参入参数! sqlserver使用master..xp_cmdshell 进行外部exe的执行。 使用master..xp_cmdshell 之前需要在据库中启用xp_cmdshell ,启用和关闭方式如下: --开启...

    sqlserver数据库触发器调用外部exe,同事可以选择参入参数!

    sqlserver使用 master..xp_cmdshell 进行外部exe的执行。

    使用master..xp_cmdshell 之前需要在据库中启用xp_cmdshell ,启用和关闭方式如下:

    --开启xp_cmdshell:
    exec sp_configure 'show advanced options', 1; 
    reconfigure; 
    exec sp_configure 'xp_cmdshell', 1; 
    reconfigure; 
    exec sp_configure 'show advanced options', 0; 
    reconfigure;
    
    --关闭xp_cmdshell:
    exec sp_configure 'show advanced options', 1; 
    reconfigure; 
    exec sp_configure 'xp_cmdshell', 0; 
    reconfigure; 
    exec sp_configure 'show advanced options', 0; 
    reconfigure;

     

    外部程序物理路径:“D:\Debug\TEST.exe”

    其中,exe程序最好是控制台应用程序,自己执行完成后自己可以进行关闭的程序,否则数据库中会一直进行循环。

    第一种,简单的执行外部exe程序:

    数据库某个表格中写触发器:

     1 USE [dt_teststep]
     2 GO
     3 
     4 SET ANSI_NULLS ON
     5 GO
     6 
     7 SET QUOTED_IDENTIFIER ON
     8 GO
     9 
    10 CREATE TRIGGER [dbo].[tritest]
    11 ON [dbo].[tb_test]
    12 FOR UPDATE --更改数据触发(insert、delete)
    13 AS
    14 BEGIN
    15     EXEC master..xp_cmdshell 'D:\Debug\TEST.exe'
    16     
    17     SET NOCOUNT ON;
    18 
    19 
    20 END
    21 GO

    当表格tb_test中数据更新修改时就会触发外部的exe程序。

     

    第二种,外部程序需要传入参数

    这里用控制台应用程序,

    static void Main(string[] args){}

    其中args为exe程序接收的传入的参数。

    数据库中的触发器写法如下:

    USE [dt_teststep]
    GO
    
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TRIGGER [dbo].[tritest]
    ON [dbo].[tb_test]
    FOR UPDATE
    AS
    BEGIN
        
        declare @Type varchar(50) ,@Result varchar(100)
        set @Type='参数1'
        set @Result = 'cmd.exe /c D:\Debug\TEST.exe '+@Type+' "参数2"'
        EXEC master..xp_cmdshell @Result
        
        SET NOCOUNT ON;
    
        -- Insert statements for trigger here
    
    END
    GO

    与第一种不同的是,带有参数,外部程序调用时改为先启动cmd,然后在进行exe的执行。

    其中,参数1作为测试,声明变量,参数2 为直接写入的参数。

    在exe程序中接收的参数就是string[] args={"参数1","参数2"};

    程序中对参数进行操作即可。

    转载于:https://www.cnblogs.com/syp1Blog/p/9482088.html

    展开全文
  • /* Sqlserver数据库开始相关服务 以下示例显示了如何查看 OLE Automation Procedures 的当前设置。0未启用 */ EXEC sp_configure 'show advanced option', '1' --只有这个高级选项被打开的时候,才有权限修改...
  • Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。你可以配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听...
  • DROP TRIGGER [tritest] USE Question GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TRIGGER [dbo].[tritest] ON [dbo].Question AFTER INSERT ... DECLARE @Result VARCHAR(100) ...
  •  本书紧密围绕程序开发人员在编程中遇到的实际问题和开发中应该掌握的技术,全面介绍了应用C#进行程序开发的技术和技巧。全书包括窗体与界面设计、控件应用、组件应用、图形技术、多媒体技术、文件系统、操作系统与...
  • SQLSERVER触发程序 发起socket
  • 一、先开启xp_cmdshell 打开外围应用配置器—> 功能的外围应用配置器—&... 实例名\Database Engine\xp_cmdshell—&...use master Exec xp_cmdshell 'mkdir d:\csj' --调用dos命令创建文件夹,(执行...
  • 试读地址:...
  • 312 实例222 打开控制面板中的程序 313 实例223 添加程序托盘 314 实例224 不出现在任务栏上的程序 314 实例225 怎样调用外部的Exe文件 315 实例226 关闭外部已开启的程序 316 7.10 ...
  • 以下使用Yum方式快速安装MySQL 5.7 版本(如果已经安装则不需求重复安装): 上传mysql-5.7.tar.gz到Linux主机上,并解压: 注:mysql-5.7.tar.gz 中包括了安装mysql5.7主要的软件包。 这样部署起来更方便 ...
  •  本书紧密围绕程序开发人员在编程中遇到的实际问题和开发中应该掌握的技术,全面介绍了应用C#进行程序开发的技术和技巧。全书包括窗体与界面设计、控件应用、组件应用、图形技术、多媒体技术、文件系统、操作系统与...
  • 触发器中回滚和提交 当执行触发器时,触发器的操作好像有一个未完成的事务在起作用。不管激发触发器的语句在隐式事务中还是显式事务中,都会这样。当语句开始以自动提交模式执行时,如果遇到错误,可以通过隐式 ...
  • SQL 触发器调用WebApi

    2018-09-15 22:47:18
    1.需求数据库表添加,修改,删除数据,触发器生效,推送数据数据到WCF接口 2.可行方案2种,第一种创建数据库项目形式 a)创建WCF服务,发布服务 b)启用数据库CLR功能,默认是关闭状态 EXEC sp_configure 'show ...
  • c#面试题

    2019-07-03 15:49:47
    1.维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么? 答:尽可能用约束(包括CHECK、主键、唯一键、外键、非空字段)实现,这种方式的效率最好;其次用触发器,这种方式可以保证无论何种业务...
1 2 3 4 5 ... 20
收藏数 3,076
精华内容 1,230