阳光网驿-企业信息化交流平台【DTC零售连锁全渠道解决方案】

 找回密码
 注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

手机号码,快捷登录

老司机
查看: 1726|回复: 4

绝对实用:用友维护人员常用SQL 脚本(第三部分)

[复制链接]
  • TA的每日心情
    开心
    2017-3-7 08:48
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2017-1-17 10:52:25 | 显示全部楼层 |阅读模式
    --查看触发器内容
    use ufdata_002_2008
    go
    exec sp_helptext 'TR_Ap_CloseBills'

    --用于查看触发器的属性(参数指定触发器所在的表)
    use ufdata_002_2008
    go
    exec sp_helptrigger Ap_CloseBills

    --创建触发器
    /*
    (1)创建一个简单的触发器
    触发器是一种特殊的存储过程,类似于事件函数,SQL Server? 允许为 INSERT、UPDATE、DELETE 创建触发器,即当在表中插入、更新、删除记录时,触发一个或一系列 T-SQL语句。
    触发器可以在查询分析器里创建,也可以在表名上点右键->“所有任务”->“管理触发器”来创建,不过都是要写 T-SQL 语句的,只是在查询分析器里要先确定当前操作的数据库。
    创建触发器用 CREATE TRIGGER
    格式如下:

    CREATE TRIGGER 触发器名称
    ON 表名
    FOR INSERT、UPDATE 或 DELETE
    AS
          T-SQL 语句

    注意:触发器名称是不加引号的。
    */
    --如下是联机丛书上的一个示例,当在 titles 表上更改记录时,发送邮件通知 MaryM。
    CREATE TRIGGER reminder
    ON titles
    FOR INSERT, UPDATE, DELETE
    AS
       EXEC master..xp_sendmail 'MaryM',
          'Don''t forget to print a report for the distributors.'
    /*
    (2)删除触发器
    用查询分析器删除
    在查询分析器中使用 drop trigger 触发器名称 来删除触发器。
    也可以同时删除多个触发器:drop trigger 触发器名称,触发器名称...
    注意:触发器名称是不加引号的。在删除触发器之前可以先看一下触发器是否存在:
    格式如下:
    ------------------------------
    if Exists(
    select name from sysobjects
    where name=触发器名称 and xtype='TR'
    )
    ------------------------------
    用企业管理器删除
    在企业管理器中,在表上点右键->“所有任务”->“管理触发器”,选中所要删除的触发器,然后点击“删除”。
    */
    /*
    (3)重命名触发器
    用查询分析器重命名
    exec sp_rename 原名称, 新名称
    sp_rename 是 SQL Server? 自带的一个存储过程,用于更改当前数据库中用户创建的对象的名称,如表名、列表、索引名等。
    用企业管理器重命名
    在表上点右键->“所有任务”->“管理触发器”,选中所要重命名的触发器,修改触发器语句中的触发器名称,点击“确定”。
    */
    /*(4)更多功能
    ①INSTEAD OF 子句
    执行触发器语句,但不执行触发触发器的 SQL 语句,比如试图删除一条记录时,将执行触发器指定的语句,此时不再执行 delete 语句。例:
    ------------------------------
    create trigger f
    on tbl
    instead of delete
    as
        insert into Logs...
    ------------------------------
    ②IF UPDATE(列名) 子句
    检查是否更新了某一列,用于 insert 或 update,不能用于 delete。例:
    ------------------------------
    create trigger f
    on tbl
    for update
    as
        if update(status) or update(title)
            sql_statement --更新了 status 或 title 列
    ------------------------------
    ③inserted、deleted(两个虚拟表的使用)
    这是两个虚拟表,inserted 保存的是 insert 或 update 之后所影响的记录形成的表,deleted 保存的是 delete 或 update 之前所影响的记录形成的表。例:

    create trigger tbl_delete
    on tbl
    for delete
    as
        declare @title varchar(200)
        select @title=title from deleted
        insert into Logs(logContent) values('删除了 title 为:' + title + '的记录')
    ------------------------------
    说明:如果向 inserted 或 deleted 虚拟表中取字段类型为 text、image 的字段值时,所取得的值将会是 null。
    */
    /*
    (5)递归、嵌套触发器
    递归分两种,间接递归和直接递归。我们举例解释如下,假如有表1、表2名称分别为 T1、T2,在 T1、T2 上分别有触发器 G1、G2。
    ? 间接递归:对 T1 操作从而触发 G1,G1 对 T2 操作从而触发 G2,G2 对 T1 操作从而再次触发 G1...
    ? 直接递归:对 T1 操作从而触发 G1,G1 对 T1 操作从而再次触发 G1...

    嵌套触发器
    类似于间接递归,间接递归必然要形成一个环,而嵌套触发器不一定要形成一个环,它可以 T1->T2->T3...这样一直触发下去,最多允许嵌套 32 层。

    设置直接递归
    默认情况下是禁止直接递归的,要设置为允许有两种方法:
    ? T-SQL:exec sp_dboption 'dbName', 'recursive triggers', true
    ? EM:数据库上点右键->属性->选项。
    ------------------------------
    设置间接递归、嵌套
    默认情况下是允许间接递归、嵌套的,要设置为禁止有两种方法:
    ? T-SQL:exec sp_configure 'nested triggers', 0 --第二个参数为 1 则为允许
    ? EM:注册上点右键->属性->服务器设置。
    */
    /*(6)触发器回滚
    我们看到许多注册系统在注册后都不能更改用户名,但这多半是由应用程序决定的, 如果直接打开数据库表进行更改,同样可以更改其用户名,在触发器中利用回滚就可以巧妙地实现无法更改用户名。

    use 数据库名
    go
    create trigger tr
    on 表名
    for update
    as
        if update(userName)
            rollback tran

    关键在最后两句,其解释为:如果更新了 userName 列,就回滚事务。
    */
    /*(7)禁用、启用触发器*/
    --禁用:
    alter table 表名 disable trigger 触发器名称
    --启用:
    alter table 表名 enable trigger 触发器名称
    /*如果有多个触发器,则各个触发器名称之间用英文逗号隔开。
    如果把“触发器名称”换成“ALL”,则表示禁用或启用该表的全部触发器。
    */

    楼主热帖
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    擦汗
    2023-12-26 04:54
  • 签到天数: 79 天

    [LV.6]常住居民II

    发表于 2017-2-16 15:06:44 | 显示全部楼层
    好坑,你这些指令太通用了吧,用友,金蝶,管家婆,只要用SQL数据库的都能用啊。无语。
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    开心
    2024-4-29 14:22
  • 签到天数: 107 天

    [LV.6]常住居民II

    发表于 2017-3-10 15:04:39 | 显示全部楼层
    好坑,你这些指令太通用了吧,用友,金蝶,管家婆,只要用SQL数据库的都能用啊。无语
    - 本文出自阳光网驿--企业信息化专家,原文地址:http://bbs.sunwy.org/thread-226937-1-1.html
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 1142 天

    [LV.10]以坛为家III

    发表于 2017-5-2 08:15:06 | 显示全部楼层
    什么咚咚咚                                                            
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    无聊
    2023-3-10 10:29
  • 签到天数: 70 天

    [LV.6]常住居民II

    发表于 2017-5-9 09:48:58 | 显示全部楼层
    还好看了楼上的没有买,还以为是什么很高级的东西。
    启用邀请码注册,提高发帖质量,建设交流社区
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表