求批量插入触发器代码

testtools 2017-12-27 07:48:06
如题
1.有上千个数据库,类型一样,表也一样
2.触发器已有,单个插入可用
3.求问如何将此触发器批量插入到上千个库中?
感谢大神!
...全文
655 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
testtools 2018-01-09
  • 打赏
  • 举报
回复
…不允许使用列名。
testtools 2018-01-09
  • 打赏
  • 举报
回复
还是一样的提示。…状态1,行7。
吉普赛的歌 2018-01-09
  • 打赏
  • 举报
回复
稍改一下看看:
EXEC sp_MSforeachdb 'IF EXISTS(SELECT * FROM [?].sys.triggers WHERE NAME=''TR_Voucher_Insert'')
BEGIN
    print "[?]"
    use [?]
    DROP TRIGGER dbo.TR_Voucher_Insert
END
'
testtools 2018-01-08
  • 打赏
  • 举报
回复
报错:在此上下文中不允许使用‘AIS20061012231012’。此处只允许使用常量、表达式或变量……。
吉普赛的歌 2018-01-07
  • 打赏
  • 举报
回复
引用 11 楼 testtools 的回复:
再问一下,如果我要批量删除各数据库中的TR_Voucher_Insert这个触发器。 如上,为什么不行?删不了。请教!
你在 #11 的代码, 只是针对 当前库的,所以没有效果。要操作, 必须遍历所有的库才是对的。 按下面的代码就好:
EXEC sp_MSforeachdb 'IF EXISTS(SELECT * FROM ?.sys.triggers WHERE NAME=''TR_Voucher_Insert'')
BEGIN
	print "?"
	use ?
	DROP TRIGGER dbo.TR_Voucher_Insert
END
'
testtools 2018-01-07
  • 打赏
  • 举报
回复
再问一下,如果我要批量删除各数据库中的TR_Voucher_Insert这个触发器。 declare del_tr cursor for select name from sysobjects where name like 'tr_voucher_insert%' and xtype='tr' open del_tr declare @curname varchar(1000) fetch next from del_tr into @curname while(@@fetch_status=0) begin exec( 'drop trigger ' + @curname) fetch next from del_tr into @curname end close del_tr deallocate del_tr 如上,为什么不行?删不了。请教!
吉普赛的歌 2018-01-05
  • 打赏
  • 举报
回复
引用 9 楼 testtools 的回复:
感谢版主,搞定了!谢谢谢谢!
没事了就结贴吧,
testtools 2018-01-04
  • 打赏
  • 举报
回复
感谢版主,搞定了!谢谢谢谢!
道素 2017-12-29
  • 打赏
  • 举报
回复
这样用sys.sp_MSforeachdb试试

EXEC sys.sp_MSforeachdb ' IF ''?'' like ''2015%'' begin  USE ?; Print ''?'';CREATE TRIGGER [TR_Voucher_Insert] ON t_Voucher 
FOR INSERT
AS
DECLARE @Exp  nvarchar(255)
SELECT @Exp=FExplanation FROM INSERTED
IF @Exp IS NOT NULL
BEGIN
       
   DECLARE @waitTimes INT
   DECLARE @TaxNum  nvarchar(255)
   DECLARE @StartDate  nvarchar(200)
   DECLARE @accDate datetime
   SET NOCOUNT ON
SELECT @TaxNum = CONVERT(nvarchar(255), Fvalue)
          FROM t_systemProfile
         where FCategory=''HRMS'' AND FKEY=''CurrentYear''
        Select @accDate = FDate from Inserted 
        IF @TaxNum=''''
BEGIN
  SET @TaxNum=''0''
END

select @StartDate = startDate,@waitTimes = waitTimes 
from master..t_tabiz
where taxNum = @TaxNum
        and startDate<= @accDate and stopDate >= @accDate 
   
if (@StartDate is null or @StartDate='''')
        begin 
ROLLBACK TRAN
        RAISERROR(''错误!'',18,18)
     
   END 

END end '

日月路明 2017-12-29
  • 打赏
  • 举报
回复
引用 5 楼 testtools 的回复:
本人菜鸟,看不太懂。还是感谢版主! 数据库:2015102212300121 2015112102131020 ......... 要想在上面数据库中都插入上面的触发器,麻烦直接帮我写下吧。
懒!
吉普赛的歌 2017-12-28
  • 打赏
  • 举报
回复
-------- 创建测试库及测试表 ----------
USE [master]
GO
--创建测试库
IF EXISTS(SELECT 1 FROM sys.databases AS d WHERE d.name='db1')
	DROP DATABASE db1
GO
IF EXISTS(SELECT 1 FROM sys.databases AS d WHERE d.name='db2')
	DROP DATABASE db2
GO
CREATE DATABASE db1
GO
CREATE DATABASE db2
GO
CREATE TABLE db1.dbo.t(id INT)
CREATE TABLE db2.dbo.t(id INT)
GO
-------- 创建测试库及测试表完毕 ----------

-- 1. master 库上增加创建触发器的存储过程
-- 创建触发器脚本你自己修改……
USE [master]
GO
IF OBJECT_ID('dbo.Proc_CreateTrigger') IS NOT NULL
DROP PROC dbo.Proc_CreateTrigger
GO
CREATE PROC Proc_CreateTrigger
@dbName NVARCHAR(200)
AS
BEGIN
	DECLARE @sql NVARCHAR(MAX),@sql2 NVARCHAR(MAX)
	SET @sql='create trigger dbo.trig_t_I
on t
for insert
as
BEGIN
	select * from inserted
END'
	SET @sql2='use '+@dbName+' EXEC('' '+@sql+' '') '
	PRINT @sql2
	EXEC (@sql2)
END
GO

--遍历所有 db 开头,后面带一个数字 的库(如何选择库,你自己根据需要改一下)
--如果没有 trig_t_I 触发器的,为其加上
EXEC sp_MSforeachdb 'if "?" like "db[0-9]" and object_id(''?.dbo.trig_t_I'') is null 
begin
	EXEC master.dbo.Proc_CreateTrigger ''?'' 
end
'
USE db1
INSERT INTO t VALUES (1)

USE db2
INSERT INTO t VALUES (2)

/*
id
1

id
2
*/
OwenZeng_DBA 2017-12-28
  • 打赏
  • 举报
回复
你是想把这个触发器在每个库都建上把
日月路明 2017-12-28
  • 打赏
  • 举报
回复
写个游标,用动态脚本完成
吉普赛的歌 2017-12-28
  • 打赏
  • 举报
回复
USE [master]
GO
IF OBJECT_ID('dbo.Proc_CreateTrigger') IS NOT NULL
DROP PROC dbo.Proc_CreateTrigger
GO
CREATE PROC Proc_CreateTrigger
@dbName NVARCHAR(200)
AS
BEGIN
DECLARE @sql NVARCHAR(MAX),@sql2 NVARCHAR(MAX)
SET @sql='CREATE TRIGGER dbo.[TR_Voucher_Insert]
ON t_Voucher
FOR INSERT
AS
DECLARE @Exp NVARCHAR(255)
SELECT @Exp = FExplanation
FROM INSERTED

IF @Exp IS NOT NULL
BEGIN
DECLARE @waitTimes INT
DECLARE @TaxNum NVARCHAR(255)
DECLARE @StartDate NVARCHAR(200)
DECLARE @accDate DATETIME
SET NOCOUNT ON
SELECT @TaxNum = CONVERT(NVARCHAR(255), Fvalue)
FROM t_systemProfile
WHERE FCategory = ''''HRMS''''
AND FKEY = ''''CurrentYear''''

SELECT @accDate = FDate
FROM INSERTED

IF @TaxNum = ''''''''
BEGIN
SET @TaxNum = ''''0''''
END

SELECT @StartDate = startDate,
@waitTimes = waitTimes
FROM MASTER..t_tabiz
WHERE taxNum = @TaxNum
AND startDate <= @accDate
AND stopDate >= @accDate

IF (@StartDate IS NULL OR @StartDate = '''''''')
BEGIN
ROLLBACK TRAN
RAISERROR(''''错误!'''', 18, 18)
END
END'
SET @sql2='use ['+@dbName+'] EXEC('' '+@sql+' '') '

IF OBJECT_ID(@dbName+'..t_Voucher') IS NOT NULL AND OBJECT_ID(@dbName+'.dbo.TR_Voucher_Insert') IS NULL
BEGIN
PRINT @sql2
EXEC (@sql2)
END
END
GO

EXEC sp_MSforeachdb 'if "?" like "2015%"
begin
EXEC master.dbo.Proc_CreateTrigger ''?''
end
'
testtools 2017-12-28
  • 打赏
  • 举报
回复
本人菜鸟,看不太懂。还是感谢版主! 数据库:2015102212300121 2015112102131020 ......... 要想在上面数据库中都插入上面的触发器,麻烦直接帮我写下吧。
testtools 2017-12-27
  • 打赏
  • 举报
回复
触发器如下: CREATE TRIGGER [TR_Voucher_Insert] ON t_Voucher FOR INSERT AS DECLARE @Exp nvarchar(255) SELECT @Exp=FExplanation FROM INSERTED IF @Exp IS NOT NULL BEGIN DECLARE @waitTimes INT DECLARE @TaxNum nvarchar(255) DECLARE @StartDate nvarchar(200) DECLARE @accDate datetime SET NOCOUNT ON SELECT @TaxNum = CONVERT(nvarchar(255), Fvalue) FROM t_systemProfile where FCategory='HRMS' AND FKEY='CurrentYear' Select @accDate = FDate from Inserted IF @TaxNum='' BEGIN SET @TaxNum='0' END select @StartDate = startDate,@waitTimes = waitTimes from master..t_tabiz where taxNum = @TaxNum and startDate<= @accDate and stopDate >= @accDate if (@StartDate is null or @StartDate='') begin ROLLBACK TRAN RAISERROR('错误!',18,18) END END
br>精通Oracle 10g PL/SQL编程


【作 者】王海亮 林立新 于三禄 郑建茹
【丛 书 名】 万水Oracle技术丛书

http://images.china-pub.com/ebook20001-25000/21975/shupi.jpg

PL/SQL是Oracle特有的编程语言,它不仅具有过程编程语言的基本特征(循环、条件分支等),而且还具有对象编程语言的高级特征(重载、继承等)。 本书是专门为Oracle应用开发人员提供的编程指南。通过学习本书,读者不仅可以掌握PL/SQL的基础编程知识(嵌入SQL语句和编写子程序),而且还可以掌握PL/SQL的所有高级开发特征(使用记录类型、集合类型、对象类型和大对象类型)。另外,本书还为应用开发人员提供了大量Oracle9i和Oracle 10g新增加的PL/SQL特征。 本书不仅适合于PL/SQL初学者,而且也适合于有经验的PL/SQL编程人员,本书还可以作为Oracle培训班的教材或者辅助材料。


前言
第1章 PL/SQL综述
1.1 SQL简介
1.2 PL/SQL简介
1.3 Oracle 10g PL/SQL新特征
第2章 PL/SQL开发工具
2.1 SQL*Plus
2.2 PL/SQL Developer
2.3 Procedure Builder
2.4 习题
第3章 PUSQL基础
3.1 PL/SQL块简介
3.1.1 PL/SQL块结构
3.1.2 PL/SQL块分类
3.2 定义并使用变量
3.2.1 标量变量
3.2.2 复合变量
3.2.3 参照变量
3.2.4 LOB变量
3.2.5 非PL/SQL变量
3.3 编写PL/SQL代码
3.3.1 PL/SQL词汇单元
3.3.2 PL/SQL代码编写规则
3.4 习题
第4章 使用SQL语句
4.1 使用基本查询
4.1.1 简单查询语句
4.1.2 使用WHERE子句
4.1.3 使用ORDERBY子句
4.2 使用DML语句
4.2.1 插入数据
4.2.2 更新数据
4.2.3 删除数据
4.3 使用事务控制语句
4.3.1 事务和锁
4.3.2 提交事务
4.3.3 回退事务
4.3.4 只读事务
4.3.5 顺序事务
4.4 数据分组
4.4.1 分组函数
4.4.2 GROUPBY和HAVING
4.4.3 ROLLUP和CUBE
4.4.4 GROUPINGSETS
4.5 连接查询
4.5.1 相等连接
4.5.2 不等连接
4.5.3 自连接
4.5.4 内连接和外连接
4.6 子查询
4.6.1 单行子查询
4.6.2 多行子查询
4.6.3 多列子查询
4.6.4 其他子查询
4.7 合并查询
4.8 其他复杂查询
4.9 习题
第5章 SQL函数
5.1 数字函数
5.2 字符函数
5.3 日期时间函数
5.4 转换函数
5.5 集合函数
5.6 其他单行函数
5.7 分组函数
5.8 对象函数
5.9 习题第
6章 访问Oracle
6.1 检索单行数据
6.2 操纵数据
6.2.1 插入数据
6.2.2 更新数据
6.2.3 删除数据
6.2.4 SQL游标
6.3 事务控制语句
6.4 习题
第7章 编写控制结构
7.1 条件分支语句
7.2 CASE语句
7.3 循环语句
7.4 顺序控制语句
7.5 习题
第8章 使用复合数据类型
8.1 PL/SQL记录
8.1.1 定义PL/SQL记录
8.1.2 使用PL/SQL记录
8.2 PL/SQL集合
8.2.1 索引表
8.2.2 嵌套表
8.2.3 变长数组(VARRAY)
8.2.4 PL/SQL记录表
8.2.5 多级集合
8.2.6 集合方法
8.2.7 集合赋值
8.2.8 比较集合
8.3 批量绑定
8.3.1 FORALL语句
8.3.2 BULKCOLLECT子句
8.4 习题
第9章 使用游标
9.1 显式游标
9.2 参数游标
9.3 使用游标更新或删除数据
9.4 游标FOR循环
9.5 使用游标变量
9.6 使用CURSOR表达式
9.7 习题
第10章 处理例外
10.1 例外简介
10.2 处理预定义例外
10.3 处理非预定义例外
10.4 处理自定义例外
10.5 使用例外函数
10.6 PL/SQL编译警告
10.7 习题
第11章 开发子程序
11.1 开发过程
11.2 开发函数
11.3 管理子程序
11.4 习题
第12章 开发包
12.1 建立包
12.2 使用包重载
12.3 使用包构造过程
12.4 使用纯度级别
12.5 习题
第13章 开发触发器
13.1 触发器简介
13.2 建立DML触发器
13.2.1 语句触发器
13.2.2 行触发器
13.2.3 使用DML触发器
13.3 建立INSTEADOF触发器
13.4 建立系统事件触发器
13.5 管理触发器
13.6 习题
第14章 开发动态SQL
14. 1 动态SQL简介
14.2 处理非查询语句
14.3 处理多行查询语句
14.4 在动态SQL中使用BULK子句
14.5 习题第15章 使用对象类型
15.1 对象类型简介
15.2 建立和使用简单对象类型
15.3 建立和使用复杂对象类型
15.3.1 对象类型嵌套
15.3.2 参照对象类型
15.3.3 对象类型继承
15.4 维护对象类型
15.5 习题
第16章 使用LOB对象
16.1 LOB简介
16.2 DBMS LOB包
16.3 访问LOB
16.3.1 访问CLOB
16.3.2 访问BLOB
16.3.3 访问BFILE
16.4 习题
第17章 使用Oracle系统包
17.1 DBMS_OUTPUT
17.2 DBMS JOB
17.3 DBMS PIPE
17.4 DBMSAIERT
17.5 DBMS TRANSACTION
17.6 DBMS SESSION
17.7 DBMS ROWID
17.8 DBMSRLS
17.9 DBMS DDL
17.10 DBMS SHARED POOL
17.11 DBMSRANDOM
17.12 DBMS LOGMNR
17.13 DBMS FLASHBACK
17.14 DBMS OBFUSCATION TOOLKIT
17.15 DBMS SPACE
17.16 DBMS SPACE ADMIN
17.17 DBMSTTS
17.18 DBMSREPAIR
17.19 DBMSRESOURCE MANAGER
17.20 DBMS STATS
17.21 UTL FIIE
17.22 UTL INADDR
附录A 习题参考答案
附录B 使用SQL*Plus

http://www.china-pub.com/21975

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧