SQLServer中对所有的用户表生成触发器

本文介绍了一种在SQL Server中使用触发器记录表操作的方法。通过创建特定的存储过程和触发器,可以记录对指定表进行的插入、更新和删除操作。此外,还提供了生成和管理这些触发器的SQL脚本。

测试的时候比较重要,我们可以知道当前交易影响了哪些表

--用于记录用户在当前表上什么时候、做的什么操作:update、insert、delete
create table TriggerRecord
(
 operdt datetime, --触发时间
 opertp varchar(10), --操作类型:update、insert、delete
 opertb varchar(50) --表名
)
--这个表于用保存生成的触发器语句,在过程中循环执行
--因为Sqlserver不允许在一个批次同时执行多条create trigger语句
create table T(sqlTrigger varchar(500))
--循环执行存于表中触发器的存储过程
create proc loopExecTrigger
as
begin
 declare @sql varchar(500)
 declare cur cursor for select sqlTrigger from T
 open cur
 fetch cur into @sql
 while @@fetch_status=0
 begin
  execute(@sql)
  fetch cur into @sql
 end
 close cur
 deallocate cur
 delete T
end

--用于生成插入语句的触发器,并将触发器语句保存到表中
select 'insert into T values(''create trigger T_'+name+' on '+name+' for insert as insert into TriggerRecord values(getdate(),''''insert'''','''''+name+''''');'')' from sysobjects where type='U' and name not in('T','TriggerRecord')
--将以上生成的语句拷贝出来执行

--用于生成更新语句的触发器,并将触发器语句保存到表中
select 'insert into T values(''create trigger T_'+name+'_U on '+name+' for update as insert into TriggerRecord values(getdate(),''''update'''','''''+name+''''');'')' from sysobjects where type='U' and name not in('T','TriggerRecord')
--将以上生成的语句拷贝出来执行

--用于生成删除语句的触发器,并将触发器语句保存到表中
select 'insert into T values(''create trigger T_'+name+'_D on '+name+' for delete as insert into TriggerRecord values(getdate(),''''delete'''','''''+name+''''');'')' from sysobjects where type='U' and name not in('T','TriggerRecord')
--将以上生成的语句拷贝出来执行

--执行通过上面语句生成的语句后,再执行存储生成触发器的存储过程
exec loopExecTrigger

--生成删除全部以T开头的触发器的语句
select 'drop trigger '+name+';' from sysobjects where type='TR' and name like 'T_%'

本文出自:冯立彬的博客



### SQL Server 导出所有结构和触发器的方法 在 SQL Server 中,导出所有结构及触发器可以通过多种方式实现。以下是一些常用的方法和 SQL 查询语句。 #### 1. 导出结构 可以使用系统目录视图来查询数据库中的所有结构信息。以下是一个示例查询: ```sql SELECT t.name AS TableName, c.name AS ColumnName, ty.name AS DataType, c.max_length AS MaxLength, c.precision AS Precision, c.scale AS Scale, c.is_nullable AS IsNullable FROM sys.tables t JOIN sys.columns c ON t.object_id = c.object_id JOIN sys.types ty ON c.user_type_id = ty.user_type_id ORDER BY t.name, c.column_id; ``` 此查询将返回所有的列名、数据类型、最大长度、精度、小数位数以及是否允许为空等信息。 #### 2. 导出触发器 为了获取所有触发器信息,可以使用以下查询: ```sql SELECT a.name AS Table, b.name AS Trigger FROM sysobjects a , sysobjects b WHERE a.id = b.parent_obj AND a.xtype = 'u' AND b.xtype = 'tr'; ``` 该查询从 `sysobjects` 系统中提取所有用户表(`xtype = 'u'`)及其相关的触发器(`xtype = 'tr'`)[^2]。 #### 3. 使用 sp_help 和 sp_helptext 存储过程 对于特定的触发器,可以使用 `sp_help` 来查看结构,使用 `sp_helptext` 来查看触发器定义: ```sql EXEC sp_help 'YourTableName'; -- 查看结构 EXEC sp_helptext 'YourTriggerName'; -- 查看触发器定义 ``` 这些存储过程提供了关于对象的详细信息,包括索引、约束和其他属性。 #### 4. 使用 SSMS (SQL Server Management Studio) 通过 SSMS 图形界面也可以轻松导出结构和触发器: - **导出结构**:右键点击数据库 -> 任务 -> 生成脚本... -> 选择“仅架构”选项。 - **导出触发器**:同样步骤,在生成脚本时确保选择了触发器对象。 #### 5. 使用 PowerShell 脚本 PowerShell 提供了强大的命令行工具来自动化导出过程。以下是一个简单的 PowerShell 脚本示例,用于导出所有结构和触发器: ```powershell $server = "YourServerName" $database = "YourDatabaseName" # 导出结构 Invoke-Sqlcmd -Query "SELECT * FROM sys.tables" -ServerInstance $server -Database $database | Export-Csv -Path "Tables.csv" -NoTypeInformation # 导出触发器 Invoke-Sqlcmd -Query "SELECT * FROM sys.triggers" -ServerInstance $server -Database $database | Export-Csv -Path "Triggers.csv" -NoTypeInformation ``` 这段脚本使用了 `Invoke-Sqlcmd` cmdlet 来执行 SQL 查询,并将结果导出到 CSV 文件中。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值