我们经理要我们做一个维护表,用来维护数据库里面表的创建,表字段的更新,还要写一个前台UI,感觉SQLServer已经都有这样的功能了,为什么还要开发一套,而且还都是用存储过程写,求大神解救我这只愤怒的小鸟。我该怎么写啊!

解决方案 »

  1.   

    写程序为了图形化显示,更直观,sqlserver是做了很多,不过有些默认没做,或者你一下子没找到
      

  2.   

    全部用存储过程来做也可以,无非就是做一个专门的存储过错,动态执行,从客户端发过来的语句呗。关键是你的前台ui,那些个信息怎么弄,建议用c#来调用smo类,来做,否则真得累死:给你一个例子:
    Smo类生成创建表的脚本语句
    http://wenku.baidu.com/link?url=Ma_rPOrw2YjxKIMDCB6-Ie3Jnib2M8JTuWI_lbYaBZJSZaoxzjP4GKje91U7QrtTTpzs4uqi0K7OC9vfkX9uNksrV1e6mCwe5aFYA0WJ1e3
      

  3.   

    工程量是有点大,如果做了会对你SQL Server有提升的
      

  4.   

    别忙着吐槽,先了解一下做这件事的背景。如果你们经理有做一个集成的开发平台的想法,这是一个很正常的步骤,如用友的NC、金蝶的BOS等,都是将后台的数据库表封装成一个个对象在前台维护,应用平台的强大功能,然后自动生成UI、业务接口等等...
      

  5.   


    以下是建立触发器实现你的需求。
    当创建表,或修改表字段 等任何 dll 操作时,
    将操作记录到某一个表中.( 基于DDL_DATABASE_LEVEL_EVENTS触发器)然后你在前台 直接查询这个表,去展现了. USE ServerLog --记录的目标库。
    --  DROP TABLE [DatabaseLog];
    /*******************************************
     * 需要给所有用户对此表的insert权限.
     *******************************************/
    CREATE TABLE [dbo].[DatabaseLog](
    [LogID] BIGINT IDENTITY(1,1) PRIMARY KEY NOT NULL,
    [ServerName] NVARCHAR(200) NOT NULL,
    [LoginName] SYSNAME NOT NULL,
    [DBUser] SYSNAME NOT NULL,
    DBName NVARCHAR(100) NULL,
    [EventType] SYSNAME NULL,
    ObjectType SYSNAME NULL,
    [Schema] [sysname] NULL,
    [Object] [sysname] NULL,
    [TSQL] [nvarchar](max) NOT NULL,
    [XmlEvent] [xml] NOT NULL,
    [PostTime] [datetime] NOT NULL,
    CreateTime DATETIME NOT NULL
    )
    GO
     
    USE [master]
    GOALTER TRIGGER trg_ServiceEventLog 
    ON ALL SERVER   --或者服务器级别 ALL SERVER  .数据库:DATABASE
    FOR DDL_DATABASE_LEVEL_EVENTS  --或者服务器级别:DDL_SERVER_LEVEL_EVENTS  .数据库级别:DDL_DATABASE_LEVEL_EVENTS
    AS
    BEGIN
        SET NOCOUNT ON;    DECLARE @data XML;
        
        SET @data = EVENTDATA();
    --PRINT CONVERT(NVARCHAR(max),@data)
        INSERT INTO ServerLog.[dbo].[DatabaseLog] ([ServerName],[LoginName],[DBUser]
        ,[DBName],[EventType],[ObjectType],[Schema],[Object],[TSQL],[XmlEvent],CreateTime,[PostTime])
        VALUES 
            (
            
            @data.value('(/EVENT_INSTANCE/ServerName)[1]', 'nvarchar(200)'),
            @data.value('(/EVENT_INSTANCE/LoginName)[1]', 'sysname'),  
            @data.value('(/EVENT_INSTANCE/UserName)[1]', 'sysname'),
            @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'nvarchar(100)'), 
            @data.value('(/EVENT_INSTANCE/EventType)[1]', 'sysname'),
            @data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'sysname'),  
            @data.value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname'), 
            @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname'), 
            @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)'), 
            @data,
            @data.value('(/EVENT_INSTANCE/PostTime)[1]', 'datetime'),
            GETDATE()
            
            );
    END;GO
     
     
    ENABLE TRIGGER trg_ServiceEventLog ON ALL SERVER
    GO