Archive for 1月 19th, 2006

对COLUMNS_UPDATED()值的解析

COLUMNS_UPDATED()
是一个仅可在 Insert or Update trigger 中调用的方法.
该方法返回 一个 varbinary 的值, 存储了当次Insert 或是 Update 触发器所对应的记录在哪些字段上发生了Inserted or updated.
COLUMNS_UPDATED 函数以从左到右的顺序返回位,最左边的为最不重要的位。最左边的位表示表中的第一列;向右的下一位表示第二列,依此类推。如果在表上创建的触发器包含 8 列以上,则 COLUMNS_UPDATED 返回多个字节,最左边的为最不重要的字节。在 INSERT 操作中 COLUMNS_UPDATED 将对所有列返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。
可以在触发器主体中的任意位置使用 COLUMNS_UPDATED。
COLUMNS_UPDATED返回值varbinary的算法:
COLUMNS_UPDATED()方法返回的 varbinary,是以每个小节存储8个字段(的修改状态)的方式记录了当前触发器所有列的修改情形.
因此程序以8个字段为一片段来循环处理所有字段.
SET @iVal= SubString(COLUMNS_UPDATED(), @i + 1, 1)
其中@i:
如果前8列,@i =1
9-16列,@i =2
17-24列,@i = 3
以次类推
程序用上面语句将一小节转化为整型.
测试发现:
当@i=1:

当且仅当这一小片只有一个字段有修改时
1,@iVal = 1 = 2^(1-1);
2,@iVal = 2 = 2^(2-1);
3,@iVal = 4 = 2^(3-1);
4,@iVal = [...]

如何Audit表的栏位被谁更新

问题:
Sql server数据库中一table的一个栏位每天会被update,如何查能查到是哪个程序做的?
SQL Server中可用sql trace去跟踪,但只能跟踪目前的session,所以只能写一Trigger去记录当时的情况(对于 oracle 来说可以用logminer去分析归档日志来实现,当然也可以写Trigger去实现),测试如下:
创建测试表并添加测试数据:
CREATE TABLE TR_TEST
(Id INT,
FullName VARCHAR(20)
)

INSERT INTO TR_TEST
VALUES(1,’BrightWen’)

INSERT INTO TR_TEST
VALUES(2,’HONGSU’)
创建Log表:
CREATE TABLE TR_TESTLOG
[...]

Page 1 of 11

    搜索本站

    站点日历

    1月 2006
    « 12   2 »
     1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031  

    订阅本站

    文章分类

    最新日志

    热点文章

    日志存档

    常用标签