当你想在你的代码中找到一个错误时,这很难;当你认为你的代码是不会有错误时,这就更难了。

sql-在.net中自动化ddl

admin 101℃
我维护一个产品,它有一个自己的数据访问层,用C++或COM编程,用于一个基于Windows的Web应用程序设计器,它至少有10年的历史了。这个dal是模块化的,类似于数据提供者,因此它可以为特定的数据库类型生成基本的sql和ddl。

在迁移分析的过程中,我发现在功能上最大的差距是ddl的生成。对于当前产品,用户创建/删除数据输入表单,然后'动态'创建或删除数据输入字段和相应的数据库表和字段(字段不能更改)。但是,外键关系是'软'的,只能在代码级别强制执行。

通过我到目前为止的研究,似乎由于安全性和数据完整性的原因,这种方法不被高度重视。这可能是我找不到具有相同功能的任何工具/orms的原因。

我用nhibernate做过实验,它包含了我需要的schemaupdate功能的一半,但只进行非破坏性的模式更新。我已经了解了处理动态模式的其他方法,如xml列,但是这会使其他因素(如数据检索和报告)变得非常复杂。

我的问题范围相当大,所以我不寻找明确的答案,只寻找指针。继续采用这种方法有哪些选择?是否有更好的选项允许我不知道的动态模式?其他可能的方法的基本优势和缺陷是什么?

你已经标记了这个问题'.net',而且你说你已经使用了nhibernate进行了实验,所以我假设你正试图迁移到.net并离开com。我还猜测您正在运行Microsoft SQL Server,但没有特定的原因必须如此(例如,软外键强制在历史上是MySQL的'功能'。

实体框架可能对数据访问层有帮助,但也会遇到同样的限制。不过,您可能要做的是继续使用前面提到的基于xml的方法,并通过与实体框架类一起工作的部分类来扩展数据模型。然后,您可以编写方法,从XML列中检索特定的伪字段并返回它们,从而帮助您的数据访问层或多或少地与应用程序的其他部分分离。

也就是说,我会好好看看您的数据建模,看看这种动态方法是否真的是必要的。你在储存什么样的数据?你能在实体框架4中,比如说,Complex Type Entities来处理它吗?我确信,重新审视您的应用程序的数据建模和业务需求将产生一种比动态模式更规范化的方法。

我也面临着类似的困境:将开发环境中所做的更改迁移到准备阶段,然后再迁移到生产阶段。 我正在处理的应用程序需要频繁修改,在上一个角色启动后不久,就到了下一个角色的时间。 如果您在SQL 2005或更高版本中,您就处于更好的位置.. 这是我想到的。 在源数据库上实现一个ddl触发器,该触发器跟踪ddl语句并将其记录到服务器实例中的单独数据库中,例如:

    Create trigger [DDLTRack]
ON Database for

CREATE_ASSEMBLY         ,ALTER_ASSEMBLY         ,DROP_ASSEMBLY
,CREATE_ASYMMETRIC_KEY  ,ALTER_ASYMMETRIC_KEY   ,DROP_ASYMMETRIC_KEY
                        --,ALTER_AUTHORIZATION
                        ,ALTER_AUTHORIZATION_DATABASE 
,CREATE_CERTIFICATE     ,ALTER_CERTIFICATE      ,DROP_CERTIFICATE
,CREATE_CONTRACT                                ,DROP_CONTRACT          
--,ADD_COUNTER_SIGNATURE                            
--,DROP_COUNTER_SIGNATURE
--,CREATE_CREDENTIAL        ,ALTER_CREDENTIAL       ,DROP_CREDENTIAL
                                                                ,GRANT_DATABASE ,DENY_DATABASE  ,REVOKE_DATABASE
,CREATE_DEFAULT                                 ,DROP_DEFAULT
                                                                ,BIND_DEFAULT   --,UNBIND_DEFAULT   
,CREATE_EVENT_NOTIFICATION                      ,DROP_EVENT_NOTIFICATION
,CREATE_EXTENDED_PROPERTY   --,ALTER_EXTENDED_PROPERTY  
,DROP_EXTENDED_PROPERTY  
,CREATE_FULLTEXT_CATALOG    ,ALTER_FULLTEXT_CATALOG ,DROP_FULLTEXT_CATALOG  
--,CREATE_FULLTEXT_INDEX        ,ALTER_FULLTEXT_INDEX   ,DROP_FULLTEXT_INDEX 
,CREATE_FUNCTION            ,ALTER_FUNCTION         ,DROP_FUNCTION
--,CREATE_INDEX             ,ALTER_INDEX            ,DROP_INDEX
--,CREATE_MASTER_KEY            ,ALTER_MASTER_KEY       ,DROP_MASTER_KEY
,CREATE_MESSAGE_TYPE        ,ALTER_MESSAGE_TYPE     ,DROP_MESSAGE_TYPE
,CREATE_PARTITION_FUNCTION  ,ALTER_PARTITION_FUNCTION   ,DROP_PARTITION_FUNCTION
,CREATE_PARTITION_SCHEME    ,ALTER_PARTITION_SCHEME     ,DROP_PARTITION_SCHEME
,CREATE_PLAN_GUIDE          ,ALTER_PLAN_GUIDE           ,DROP_PLAN_GUIDE 
,CREATE_PROCEDURE           ,ALTER_PROCEDURE            ,DROP_PROCEDURE
,CREATE_QUEUE               ,ALTER_QUEUE                ,DROP_QUEUE
,CREATE_REMOTE_SERVICE_BINDING  ,ALTER_REMOTE_SERVICE_BINDING   ,DROP_REMOTE_SERVICE_BINDING
--,CREATE_SPATIAL_INDEX                                                                 
--  ,RENAME   
,CREATE_ROLE                ,ALTER_ROLE                 ,DROP_ROLE  
--,ADD_ROLE_MEMBER                                      ,DROP_ROLE_MEMBER
,CREATE_ROUTE               ,ALTER_ROUTE                ,DROP_ROUTE
,CREATE_RULE                                            ,DROP_RULE              
                                                                                            ,BIND_RULE  ,UNBIND_RULE 
,CREATE_SCHEMA              ,ALTER_SCHEMA               ,DROP_SCHEMA
,CREATE_SERVICE             ,ALTER_SERVICE              ,DROP_SERVICE
--,ALTER_SERVICE_MASTER_KEY                 
--,BACKUP_SERVICE_MASTER_KEY    
--,RESTORE_SERVICE_MASTER_KEY
--,ADD_SIGNATURE                                            ,DROP_SIGNATURE

--,CREATE_STATISTICS                                        ,DROP_STATISTICS                    ,UPDATE_STATISTICS
--,CREATE_SYMMETRIC_KEY     ,ALTER_SYMMETRIC_KEY        ,DROP_SYMMETRIC_KEY
,CREATE_SYNONYM                                         ,DROP_SYNONYM
,CREATE_TABLE               ,ALTER_TABLE                ,DROP_TABLE
,CREATE_TRIGGER             ,ALTER_TRIGGER              ,DROP_TRIGGER
,CREATE_TYPE                                            ,DROP_TYPE
,CREATE_USER                ,ALTER_USER                 ,DROP_USER 
,CREATE_VIEW                ,ALTER_VIEW                 ,DROP_VIEW
,CREATE_XML_INDEX           
,CREATE_XML_SCHEMA_COLLECTION   ,ALTER_XML_SCHEMA_COLLECTION    ,DROP_XML_SCHEMA_COLLECTION


as 
insert ddlTracking..ddlLog(TSQL,SchemaName,ObjectName,ObjectType,eventXML,LoginName,dbName,EventType)
Select EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
       ,EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]','nvarchar(max)')
       ,EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(max)')
       ,EVENTDATA().value('(/EVENT_INSTANCE/ObjectType)[1]','nvarchar(max)')
       ,EVENTDATA()
       ,EVENTDATA().value('(/EVENT_INSTANCE/LoginName)[1]','nvarchar(max)')
       ,EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]','nvarchar(max)')
       ,EVENTDATA().value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(max)')






GO

SET ANSI_NULLS OFF
GO

SET QUOTED_IDENTIFIER OFF
GO

DISABLE TRIGGER [DDLTRack] ON DATABASE
GO

ENABLE TRIGGER [DDLTRack] ON DATABASE
GO

这将是您所有的更改

在(本例中)ddltrack.dbo.ddllog表.. 然后,通过筛选源数据库中所需的条目并将其应用于目标数据库,可以将对数据库对象所做的最后修改分组。 高温

转载请注明:我的代码 » sql-在.net中自动化ddl