一个触发器,用户创建新表时,同样创建一个与之相同的表,表名后加——bk用户插入数据时也插入数据

解决方案 »

  1.   

    这不是一个触发器
    1:数据库触发器,这个只有SQL2005以上版本才用,当用户创建表的时候触发
    2: 表触发器,当用户插入时触发
      

  2.   


    发这么多帖子啊
    用户创建的时候需要加一个dml 触发器
    IF EXISTS (SELECT * FROM sys.triggers WHERE parent_class = 0 AND name = 'tt')
    DROP TRIGGER tt ON DATABASE;
    GO
    CREATE TRIGGER tt ON DATABASE
    FOR CREATE_TABLE
    AS
    BEGIN 
    SET CONCAT_NULL_YIELDS_NULL ON
    DECLARE @AffectedTable nvarchar(255),@backUpTable nvarchar(255),@create_Script nvarchar(max)
    --获取建表的语句
    SELECT  @create_Script=EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
    --获取表的名称
    SELECT  @AffectedTable = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(255)')
    --定义一个备份的表名称
    SELECT  @backUpTable =@AffectedTable+'_bk'
    --替换表名
    SELECT  @create_Script=REPLACE(@create_Script,@AffectedTable,@backUpTable)
    --执行建表语句
    EXEC(@create_Script)
    --给创建的表加一个DML触发器
    EXEC('
    CREATE TRIGGER tt_'+@AffectedTable+' ON '+@AffectedTable+'
    FOR INSERT
    AS 
    BEGIN
    INSERT INTO '+@backUpTable+' SELECT * FROM INSERTED
    END'
    )
    SET CONCAT_NULL_YIELDS_NULL OFF
    END --> 测试[tb]
    IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
    GO 
    CREATE TABLE [tb]([id] INT,[name] VARCHAR(4))
    GO INSERT [tb]
    SELECT 1,'土豆' UNION ALL 
    SELECT 2,'水锅'SELECT * FROM tb
    /*
    id name
    1 土豆
    2 水锅
    */
    SELECT * FROM tb_bk
    /*
    id name
    2 水锅
    1 土豆
    */DROP TABLE tb_bk