- 浏览: 557113 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (401)
- 默认类别 (1)
- AJAX (0)
- Coffee House (81)
- cvs (1)
- cygwin (2)
- Eclipse (1)
- EJB (0)
- ERP (1)
- Hibernate (16)
- Html (8)
- iBatis (0)
- IDE (0)
- J2SE (7)
- Javascript (11)
- Jboss (0)
- Jdbc (4)
- Jni--Communication (1)
- Management (10)
- NetWork (0)
- Oracle (0)
- PowerDesigner (0)
- Proxool (1)
- Question (0)
- SoftwareEngineering (12)
- Spring (13)
- SqlServer (22)
- Struts (0)
- Tutorial (1)
- VFP (0)
- Web Service (0)
- WebWork (6)
- WSAD (1)
- test (1)
最新评论
-
zyp731:
虽然很简单,但是很适用,我就找了好久,非常不喜欢大黑点的那种样 ...
ERWIN改变关系之间连线的样式 -
Love_洋果子:
写的很实在,我们老总及老大就很注重测试部门,所以自己做的很开心 ...
再谈测试 -
娴静女生:
2010年开始用新浪微博ID:http://t.sina.co ...
微博大家在写吗? -
saapaa:
hgq0011 写道 大家有开通微博吗?
...
微博大家在写吗? -
lxtxlyb:
文章太给力了,但是我现在有个问题,同一个tomcat下面,其他 ...
spring+hibernate初始化出错,错误真是隐蔽得很,让人郁闷,,,
在网上找到了一个类似的文章http://www.cnblogs.com/delphi/articles/121516.html来引用这文章.我在它的基础上加了更详细注解。 如下:
CREATE Table T_Test (
f_id int IDENTITY(1, 1) Primary Key,
f_char Char(8) default '',
f_varchar varchar(8) default '',
f_nvarchar nvarchar(8) default '',
f_datetime datetime default getdate(),
f_int int default 0,
f_bigint bigint default 0,
f_decimal decimal(18, 6) default 0.00,
f_number numeric(18, 6) default 0.00,
f_float float default 0.00
)
go
INSERT INTO T_Test (f_char) values('001')
INSERT INTO T_Test (f_char) values('002')
go
select * from t_test
If exists(select * from sysobjects where id=object_id(N'[dbo].[Tri_Test_Upd]') and objectproperty(id,N'istrigger')=1)
DROP TRIGGER Tri_Test_Upd
go
CREATE TRIGGER Tri_Test_Upd ON T_Test --WITH ENCRYPTION
FOR UPDATE
AS
DECLARE @iRowCnt INT --列数
SET @iRowCnt = @@rowcount
IF @iRowCnt < 1
RETURN
DECLARE
@sTable VARCHAR(128), --表名
@sPKName VARCHAR(32), --主鍵名
@sColName VARCHAR(128) --列名
DECLARE
@iColCnt INT, --列数
@iColId INT --列id
DECLARE
@i TINYINT,
@j TINYINT,
@iSegment TINYINT, --以8为除数得余数(有少个分段)
@iVal TINYINT, --被更新过的字段的十六进制值
@iLog2 TINYINT
DECLARE
@sSQL VARCHAR(8000) --执行的sql
SET @sTable = 't_test'
SET @sPKName = 'f_id'
-- 求得当前表列个数
SELECT @iColCnt = Count(1) FROM syscolumns WHERE id = object_id(@sTable)
-- 以8个字段为一小段
SET @iSegment = CASE
WHEN @iColCnt / 8 = @iColCnt / 8.0 --如果列总数是8的倍数那就取整数,否则取整数再加1
THEN
@iColCnt / 8
ELSE
@iColCnt / 8 + 1
END
-- 将数据存入临时表
SELECT * INTO #Inserted FROM Inserted --更新的数据
SELECT * INTO #Deleted FROM Deleted --更新前的数据
--中间处理数据用
CREATE TABLE #Temp(
f_PKVal varchar(254) not null primary key, --主键
f_OldVal varchar(254), --原来的值
f_NewVal varchar(254) --新的值
)
SET @i = 0 --循环整个分段(也就所有的字段)
WHILE @i < @iSegment
BEGIN
--8个字段为一个分区,当表的列数大于8,那么计算被更新过的字段的十六进制值方法不同
IF @iColCnt < 9 --表的列数小于8
SET @iVal= COLUMNS_UPDATED()
ELSE --表的列数大于8
SET @iVal= SubString(COLUMNS_UPDATED(), @i + 1, 1)
--等于零,则表示当前小节所对应的8个字段没有被更新(修改)过,中止本次循环,继续下一次循环
IF @iVal = 0
BEGIN
SET @i = @i + 1
CONTINUE
END
WHILE @iVal > 0
BEGIN
SET @j = 0
SET @iLog2 = @iVal / 2 --被更新字段十六进制值除2得余数
WHILE @iLog2 > 0
BEGIN
SET @j = @j + 1
SET @iLog2 = @iLog2 / 2
END --end @iLog2 > 0
-- 得到被Update 的 列ID
SET @iColId = 8 * @i + @j + 1
-- 将Update列名 赋予 @sColName
SELECT @sColName = S.name FROM Inserted as I,Deleted as D,Syscolumns as S WHERE I.F_id = D.F_id
AND S.id = object_id(@sTable)
AND S.colid = @iColId
Truncate table #Temp
--拼成功能语句
SET @sSQL = 'INSERT INTO #Temp (f_PkVal, f_OldVal, f_NewVal) ' +
'SELECT Convert( varchar(200), I.' + @sPkName + '), ' +
'Convert( varchar(200), D.' + @sColName + '), ' +
'Convert( varchar(200), I.' + @sColName + ') ' +
'FROM #Inserted as I, #Deleted as D ' +
'WHERE I.' + @sPKName + ' = D.' + @sPKName +
' AND I.' + @sColName + ' <> D.' + @sColName
EXEC(@sSQL) --执行sql
-- 测试输出
Select f_pkVal, @sColName as f_column_name, f_oldVal, f_newVal FROM #temp
-- 实际上用将信息处理后插入消息表
/**//**//**//*
..
INSERT INTO T_Message(.)
SELECT 要组成的内容
FROM #temp
*/
SET @iVal = @iVal - Power(2, @j)
END -- end @iVal > 0
SET @i = @i + 1
END -- end @i < @iSegment
DROP TABLE #Inserted
DROP TABLE #Deleted
DROP TABLE #Temp
go
select from Syscolumns as S object_id('t_test')
SELECT s.name ,s.colid FROM syscolumns as s WHERE id = object_id('t_test') and s.colid = 1
Update T_test Set f_datetime = getdate(), f_float = 0.0123, f_int= 1 where f_id = 2
f_id int IDENTITY(1, 1) Primary Key,
f_char Char(8) default '',
f_varchar varchar(8) default '',
f_nvarchar nvarchar(8) default '',
f_datetime datetime default getdate(),
f_int int default 0,
f_bigint bigint default 0,
f_decimal decimal(18, 6) default 0.00,
f_number numeric(18, 6) default 0.00,
f_float float default 0.00
)
go
INSERT INTO T_Test (f_char) values('001')
INSERT INTO T_Test (f_char) values('002')
go
select * from t_test
If exists(select * from sysobjects where id=object_id(N'[dbo].[Tri_Test_Upd]') and objectproperty(id,N'istrigger')=1)
DROP TRIGGER Tri_Test_Upd
go
CREATE TRIGGER Tri_Test_Upd ON T_Test --WITH ENCRYPTION
FOR UPDATE
AS
DECLARE @iRowCnt INT --列数
SET @iRowCnt = @@rowcount
IF @iRowCnt < 1
RETURN
DECLARE
@sTable VARCHAR(128), --表名
@sPKName VARCHAR(32), --主鍵名
@sColName VARCHAR(128) --列名
DECLARE
@iColCnt INT, --列数
@iColId INT --列id
DECLARE
@i TINYINT,
@j TINYINT,
@iSegment TINYINT, --以8为除数得余数(有少个分段)
@iVal TINYINT, --被更新过的字段的十六进制值
@iLog2 TINYINT
DECLARE
@sSQL VARCHAR(8000) --执行的sql
SET @sTable = 't_test'
SET @sPKName = 'f_id'
-- 求得当前表列个数
SELECT @iColCnt = Count(1) FROM syscolumns WHERE id = object_id(@sTable)
-- 以8个字段为一小段
SET @iSegment = CASE
WHEN @iColCnt / 8 = @iColCnt / 8.0 --如果列总数是8的倍数那就取整数,否则取整数再加1
THEN
@iColCnt / 8
ELSE
@iColCnt / 8 + 1
END
-- 将数据存入临时表
SELECT * INTO #Inserted FROM Inserted --更新的数据
SELECT * INTO #Deleted FROM Deleted --更新前的数据
--中间处理数据用
CREATE TABLE #Temp(
f_PKVal varchar(254) not null primary key, --主键
f_OldVal varchar(254), --原来的值
f_NewVal varchar(254) --新的值
)
SET @i = 0 --循环整个分段(也就所有的字段)
WHILE @i < @iSegment
BEGIN
--8个字段为一个分区,当表的列数大于8,那么计算被更新过的字段的十六进制值方法不同
IF @iColCnt < 9 --表的列数小于8
SET @iVal= COLUMNS_UPDATED()
ELSE --表的列数大于8
SET @iVal= SubString(COLUMNS_UPDATED(), @i + 1, 1)
--等于零,则表示当前小节所对应的8个字段没有被更新(修改)过,中止本次循环,继续下一次循环
IF @iVal = 0
BEGIN
SET @i = @i + 1
CONTINUE
END
WHILE @iVal > 0
BEGIN
SET @j = 0
SET @iLog2 = @iVal / 2 --被更新字段十六进制值除2得余数
WHILE @iLog2 > 0
BEGIN
SET @j = @j + 1
SET @iLog2 = @iLog2 / 2
END --end @iLog2 > 0
-- 得到被Update 的 列ID
SET @iColId = 8 * @i + @j + 1
-- 将Update列名 赋予 @sColName
SELECT @sColName = S.name FROM Inserted as I,Deleted as D,Syscolumns as S WHERE I.F_id = D.F_id
AND S.id = object_id(@sTable)
AND S.colid = @iColId
Truncate table #Temp
--拼成功能语句
SET @sSQL = 'INSERT INTO #Temp (f_PkVal, f_OldVal, f_NewVal) ' +
'SELECT Convert( varchar(200), I.' + @sPkName + '), ' +
'Convert( varchar(200), D.' + @sColName + '), ' +
'Convert( varchar(200), I.' + @sColName + ') ' +
'FROM #Inserted as I, #Deleted as D ' +
'WHERE I.' + @sPKName + ' = D.' + @sPKName +
' AND I.' + @sColName + ' <> D.' + @sColName
EXEC(@sSQL) --执行sql
-- 测试输出
Select f_pkVal, @sColName as f_column_name, f_oldVal, f_newVal FROM #temp
-- 实际上用将信息处理后插入消息表
/**//**//**//*
..
INSERT INTO T_Message(.)
SELECT 要组成的内容
FROM #temp
*/
SET @iVal = @iVal - Power(2, @j)
END -- end @iVal > 0
SET @i = @i + 1
END -- end @i < @iSegment
DROP TABLE #Inserted
DROP TABLE #Deleted
DROP TABLE #Temp
go
select from Syscolumns as S object_id('t_test')
SELECT s.name ,s.colid FROM syscolumns as s WHERE id = object_id('t_test') and s.colid = 1
Update T_test Set f_datetime = getdate(), f_float = 0.0123, f_int= 1 where f_id = 2
这样还真行,很高兴又学到了一招,:)这样很有意思,也有挑战性。
基礎知識:
COLUMNS_UPDATED()是一個僅可在 Insert or Update trigger 中調用的方法.
該方法返回 一個 varbinary 的值, 存儲了當次Insert 或是 Update 觸發器所對應的記錄在哪些字段上發生了Inserted or updated.在SQLSERVER 的聯機幫助[CREATE TRIGGER]和[IF UPDATE] 中 有對 COLUMNS_UPDATED () 方法的簡要描述.
发表评论
-
osql 用法
2010-04-14 13:58 1108osql -U sa -P sa -S 192.168.1.5 ... -
备份数据库SQL
2009-01-08 10:52 1108SET QUOTED_IDENTIFIER ON GO SE ... -
动态交叉表
2008-09-02 16:31 805在开发项目过程中经常要用到交叉表,方便用户查看数据,交 ... -
SQL Server 收缩事务日志
2008-07-26 10:00 859BACKUP LOG DB_Name WITH TRUNCA ... -
(SQL)同一列的多行字符串数据怎么转换成同一列的一行数据?
2008-02-29 16:04 3081同一列的多行字符串数据用SQL怎么转 ... -
系统性能优化过程.
2008-01-31 22:11 1656现在的公司的系统很不稳定,尤其在高峰期间,一个系统的性 ... -
Sql错误代码14274
2008-01-30 11:26 1507在删除作业的时候出现如下的错误提示:错误1427 ... -
CPU使用率不高,内存怎么使用率也不高,但系统假死了
2007-03-19 09:20 8677在一个企业中待两年多了,遇到各种问题,很多都没有经验,只能考自 ... -
sqlserver中,sql编程的几个小常
2005-09-06 09:31 1244sqlserver中,sql编程的几个小常 ... -
得到表的字段名
2005-09-06 09:31 1289SELECT s.name ,s.colid FROM sy ... -
生成唯一值
2005-09-06 09:32 1439NEWID()创建 uniqueidentifier 类型的唯 ... -
sql server 远程引用
2005-09-06 09:51 1196在sql server 中能远程查询更新数据(OPENDATA ... -
sql server 链接服务器
2005-09-06 09:53 1763sql server 链接服务器: 创建一个链接的服务器,使其 ... -
sql一些常用的方法
2005-09-08 16:26 11541:执行另一服务器上的存储过程exec OPENDATA ... -
提高查询数据的性能历险记
2005-12-07 15:36 1079... -
sql server备份数据库
2006-01-11 11:11 1425数据是企业的重要信息,可能也是商业机密.所以我们一 ... -
[转载]SQL 过程的性能: 提示和技巧
2006-01-24 10:35 841http://www-128.ibm.com/develope ... -
"无法解决 equal to 操作的排序规则冲突"?
2006-02-14 16:08 2177在sql server 2000 下 运行关联表的sq ... -
对链接的服务器运行分布式事务处理时出现错误
2006-05-10 10:13 1650运行程序出现了如下的错误: ja ... -
SQL Server 不存在或拒绝访问
2006-10-03 14:28 2048由于国庆全公司都放假了,所以服务器,电源都停止 ...
相关推荐
在数据库管理中,触发器是一种特殊的存储过程,它在特定的数据操作...理解并掌握这些知识点对数据库管理和开发至关重要,因为触发器可以用来维护数据库的一致性,实现复杂的业务规则,以及在数据更新时执行自定义逻辑。
### SQL在更新某字段后写入日志触发器 #### 背景介绍 在数据库管理系统(DBMS)中,触发器是一种存储过程,当特定的事件(如数据的插入、更新或删除)发生时自动执行。触发器常用于实现业务逻辑、数据验证或审计...
触发器可以用来确保数据完整性,并且可以在记录被插入、更新或删除时执行复杂的逻辑。 #### SQL触发器的状态 SQL触发器有两种基本状态:启用(ENABLED)与禁用(DISABLED)。当触发器处于启用状态时,任何触发该...
触发器是一种存储过程,它定义在特定的表上,并且在特定的事件(如插入、更新或删除操作)发生时自动执行。 #### 二、描述详解 描述中的代码片段展示了如何创建一个触发器`TT`,该触发器作用于`TSYS_BAMKZ`表上,...
触发器是一种特殊类型的存储过程,它被定义为当特定的事件(如数据的插入、更新或删除)发生时自动执行。Sql Server 中的触发器可以用来强制业务规则或者数据完整性。触发器对于维护数据库的一致性和安全性非常有用...
在本实验中,虽然主要涉及的是SQL Server中的触发器,但C#可以用来编写与数据库交互的应用程序,例如创建触发器的界面或自动化脚本等。 #### 三、实验目标 本实验的目标是创建一个触发器,当从`HumanResources.Job...
3. 当在`customer`表上执行INSERT操作时,触发器会被激活并更新`create_date`字段。为了验证触发器是否生效,可以通过执行INSERT语句并检查结果来确认。例如,插入一条新的客户记录后,`create_date`字段应该会显示...
SQL注入是一种常见的Web应用程序安全漏洞,攻击者可以通过在输入字段中插入恶意SQL代码来操纵数据库查询,从而获取未授权的数据访问或对数据进行修改。为了防止这种攻击,开发人员需要采取一系列措施,包括参数化...
触发器逻辑中,通过比较更新操作前后字段`ulevelid`、`ustatid`和`exbudget`的值,判断是否满足插入新事件记录的条件。如果满足,则向`FC_Output.fcevent`表中插入两条记录。 **触发器的管理** 除了创建触发器,...
`xtype`字段表示对象类型,其中`TR`代表触发器。通过这条SQL语句,我们可以查询到当前数据库中存在的所有触发器。 **获取触发器的创建脚本:** 获取触发器的创建脚本能帮助我们在其他环境中重新创建相同的触发器。...
触发器可以用来强制实施复杂的业务规则或者维护数据的一致性。在本例中,我们将使用触发器来记录对某张表的操作日志。 #### 三、SQL Server的Inserted和Deleted虚拟表 在SQL Server中,`Inserted`和`Deleted`是两...
### MySQL触发器详解 #### 一、触发器概念与作用 触发器是一种存储过程,它定义了一组SQL语句,并且被设计成自动响应特定事件(如数据的修改)。触发器通常用于强化复杂的业务规则或者数据完整性约束。它们可以在...
- `UPDATE 数据表 SET 字段名=字段值 WHERE 条件表达式`:用于更新指定记录的字段值。 - 可以同时更新多个字段,用逗号分隔:`SET 字段1=值1,字段2=值2...` 3. **删除数据记录**: - `DELETE FROM 数据表 WHERE ...
--求那些人的薪水是在平均薪水之上的。 61、select ename, sal from emp join (select max(sal) max_sal ,deptno from emp group by deptno) t on (emp.sal = t.max_sal and emp.deptno=t.deptno); --查询每个...
触发器能够提供对比数据库修改前后的数据状态变化的能力,通过触发器,我们可以轻松获取到被UPDATE、INSERT或DELETE影响到的数据记录。 5. 维护非规范化数据 对于非规范化的数据库设计,触发器可以帮助维护那些派生...
触发器是一种存储过程,当特定事件(如插入、更新或删除数据)发生时自动执行。在此场景中,我们将创建一个触发器,在向表中插入新记录时自动设置自增字段的值。 **创建触发器:** 接下来,创建一个触发器`sq_...
触发器可以用来执行复杂的逻辑,比如在向表中插入新记录时自动为某个字段赋值。 ##### 创建触发器 创建触发器的基本语法如下: ```sql CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE|AFTER} {INSERT|UPDATE|...
通过以上分析可以看出,触发器是数据库中非常强大的工具,可以用来实现复杂的数据完整性规则和业务逻辑。在设计触发器时需要注意避免循环引用和死锁等问题,同时也要确保触发器逻辑的正确性和效率。在实际应用中,...
这是通过比较`tb`表和`inserted`表中的`vlistid`来实现的,确保只更新那些`recommend`字段被修改的行。 触发器的这种功能对于跟踪数据更改、执行复杂的业务逻辑和审计操作非常有用。例如,你可以使用触发器来确保...
在描述中提到的场景中,触发器被用来确保当在一张表中添加新记录时,另一张相关的表也会同步更新。例如,如果有一个订单表和一个订单详情表,每当在订单表中增加一个新的订单,触发器可以自动在订单详情表中创建相应...