This script will create scripts for every Table.
This makes it easy to check them in to VSS.
Usage :
DMOScriptTables 'Databasename','Directoryname'
2007-04-16 (first published: 2007-03-20)
14,110 reads
This script will create scripts for every Table.
This makes it easy to check them in to VSS.
Usage :
DMOScriptTables 'Databasename','Directoryname'
create procedure dbo.dmoScriptTables
@pDatabaseName varchar(255),
@workingfolder varchar(255) = null,
@pInstanceName varchar(30) = null
as
-- common
declare @dmoServer int,
@path varchar(255),
@cmd varchar(1200),
@returnstatus int,
@dmoMethod varchar(255),
@dmoProperty varchar(255),
@dmoCollection varchar(255),
@scriptFile varchar(255),
@hr int,
@oleErrorSource varchar(255),
@oleErrorDescription varchar(1000),
@scriptType int,
@procedureName sysname,
@Processflowerror varchar(255),
@pTempFolder varchar(255),
--tables
@isSystemTable tinyint,
@tableCount int,
@curTableNb int,
@tableName varchar(256),
@tableScriptType int,
@permissionsScriptType int,
@firstTable bit,
@permissionsScriptFile varchar(255),
-- keys
@keyCount int,
@curKeyNb int,
@keyName varchar(255),
@keyType int,
-- dridefaults
@columnCount int,
@curColumnNb int,
@objectName varchar(255),
@DRIDefaultName varchar(255),
-- indexes
@indexCount int,
@curIndexNb int,
@indexName varchar(256),
@indexType int,
-- checks
@checkCount int,
@curCheckNb int,
@checkName varchar(256),
-- triggers
@triggerCount int,
@curTriggerNb int,
@triggerName varchar(256)
-- Directory Structure Temp Directory
Declare @prefix varchar(1000)
Declare @prefix_fil varchar (1000)
Declare @prefix_tab varchar (1000)
Declare @prefix_cns varchar (1000)
Declare @prefix_viw varchar (1000)
Declare @prefix_trg varchar (1000)
Declare @prefix_rul varchar (1000)
Declare @prefix_ind varchar (1000)
Declare @prefix_prc varchar (1000)
Declare @prefix_udf varchar (1000)
Declare @prefix_def varchar (1000)
Declare @prefix_ftc varchar (1000)
Declare @prefix_rol varchar (1000)
Declare @prefix_udt varchar (1000)
Declare @prefix_usr varchar (1000)
-- Memory Table For logging
Declare @ActivityLog table
( id int identity,
activity varchar(1000))
-- Ok here we begin with the stuff
set nocount on
set @Processflowerror = ''
set @prefix = @workingFolder + '\DB-Framework\'
set @prefix_fil = @prefix + '01. Filegroups\'
set @prefix_tab = @prefix + '02. Tables (only columns)\'
set @prefix_cns = @prefix + '03. PK + FKs + Constraints\'
set @prefix_viw = @prefix + '04. Views\'
set @prefix_trg = @prefix + '06. Triggers\'
set @prefix_rul = @prefix + '07. Rules\'
set @prefix_ind = @prefix + '08. Indexes\'
set @prefix_prc = @prefix + '09. Stored Procedures\'
set @prefix_udf = @prefix + '10. User Defined Functions\'
set @prefix_def = @prefix + '11. Defaults\'
set @prefix_FTC = @prefix + '12. Full Text Catalogs\'
set @prefix_rol = @prefix + '13. Roles\'
set @prefix_UDT = @prefix + '14. User Defined Datatypes\'
set @prefix_USR = @prefix + '15. Database users\'
-- init
set @procedureName = db_name() + '.'
+ user_name(objectproperty(@@procid,'OwnerId'))
+ '.' + object_name(@@procid)
-- table script options
set @tableScriptType = 4 -- primary object
+ 64 -- to
+ 512-- no DRI
+ 4096 -- if not exists
+ 262144-- owner qualify
-- permissions script options
set @permissionsScriptType = 2 -- object permissions
+ 32 -- database (statement) permissions
-- + 256 -- append (add this after first table inits the file)
set @permissionsScriptFile = @path + 'allTablePermissions.sql'
set @firstTable = 0
-- constraint, index and trigger script options
set @scriptType = 1-- drop
+ 4-- primary object
+ 64-- to file only
+ 4096-- if not exists
+ 262144-- owner qualify
-- open an in-process COM/DMO connection to this server
exec @hr = master..sp_OACreate 'SQLDMO.SQLServer', @dmoServer OUT
if @hr <> 0 goto ErrorHandler
-- set the security context to integrated
exec @hr = master..sp_OASetProperty @dmoServer,'loginSecure',1
if @hr <> 0 goto ErrorHandler
-- connect to the specified server
exec @hr = master..sp_OAMethod @dmoServer,'Connect',NULL,@@servername
if @hr <> 0 goto ErrorHandler
-- script each table and table child object to a separate file
select @dmoProperty = 'Databases("'
+ @pDatabaseName
+ '").Tables.Count'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@tableCount OUT
if @hr <> 0 goto ErrorHandler
select @curTableNb = 1
while @curTableNb <= @tableCount
begin
print str(@Tablecount)
-- refresh the DMO buffers each iteration
select @dmoMethod = 'Databases("'
+ @pDatabaseName
+ '").Tables.Refresh(TRUE)'
exec @hr = master.dbo.sp_OAMethod @dmoServer,
@dmoMethod,
NULL
if @hr <> 0 goto ErrorHandler
select @dmoProperty = 'Databases("'
+ @pDatabaseName
+ '").Tables.Item('
+ cast(@curTableNb as varchar(10))
+ ').SystemObject'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@isSystemTable OUT
if @hr <> 0 goto ErrorHandler
-- only script user table
if @isSystemTable = 0
begin
-- get the table name
select @dmoProperty = 'Databases("'
+ @pDatabaseName
+ '").Tables.Item('
+ cast(@curTableNb as varchar(10))
+ ').Name'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@tableName OUT
if @hr <> 0 goto ErrorHandler
select @dmoMethod = 'Databases("'
+ @pDatabaseName
+ '").Tables("'
+ @tableName
+ '").Script'
-- put each table script in its own file
select @scriptFile = @prefix_tab + @tableName + '.sql'
exec @hr = master.dbo.sp_OAMethod @dmoServer,
@dmoMethod,
NULL,
@tableScriptType,
@scriptFile
if @hr <> 0 goto ErrorHandler
-- put all table permissions in one file
exec @hr = master.dbo.sp_OAMethod @dmoServer,
@dmoMethod,
NULL,
@permissionsScriptType,
@permissionsScriptFile
if @hr <> 0 goto ErrorHandler
-- append all remaining permissions to this file
if @firstTable = 0
begin
set @permissionsScriptType = @permissionsScriptType + 256
set @firstTable = 1
end
--keys
set @keyType = 0
select @dmoProperty = 'Databases("' +
@pDatabaseName
+ '").Tables("'
+ @tableName
+ '").Keys.Count'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@keyCount OUT
if @hr <> 0 goto ErrorHandler
set @curKeyNb = 1
while @curKeyNb <= @keyCount
begin
select @dmoProperty = 'Databases("'
+ @pDatabaseName
+ '").Tables("'
+ @tableName
+ '").Keys('
+ cast(@curKeyNb as varchar(10))
+ ').type'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@keyType OUT
if @hr <> 0 goto ErrorHandler
select @dmoProperty = 'Databases("'
+ @pDatabaseName
+ '").Tables("'
+ @tableName
+ '").Keys('
+ cast(@curKeyNb as varchar(10))
+ ').Name'
exec @hr = master.dbo.sp_OAGetProperty
@dmoServer,
@dmoProperty,
@keyName OUT
if @hr <> 0 goto ErrorHandler
if @keyName <> ''
begin
select @dmoMethod = 'Databases("'
+ @pDatabaseName
+ '").Tables("'
+ @tableName
+ '").Keys('
+ cast(@curKeyNb as varchar(10))
+ ').Script'
if @keyType = 1
set @scriptFile = @prefix_cns + @keyName + '_PK.sql'
if @keyType = 2
set @scriptFile = @prefix_cns + @keyName + '_UNIQUE.sql'
if @keyType = 3
set @scriptFile = @prefix_cns + @keyName + '_FK.sql'
exec @hr = master.dbo.sp_OAMethod @dmoServer,
@dmoMethod,
NULL,
@scriptType,
@scriptFile
if @hr <> 0 goto ErrorHandler
end
set @curKeyNb = @curKeyNb + 1
end
--DRI Defaults
set @curColumnNb = 1
select @dmoProperty = 'Databases("'
+ @pDatabaseName
+ '").Tables("'
+ @tableName
+ '").Columns.Count'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@columnCount OUT
if @hr <> 0 goto ErrorHandler
while @curColumnNb <= @columnCount
begin
select @dmoProperty = 'Databases("'
+ @pDatabaseName
+ '").Tables("'
+ @tableName
+ '").Columns('
+ cast(@curColumnNb as varchar(10))
+ ').DRIDefault.Name'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@DRIDefaultName OUT
if @hr <> 0 goto ErrorHandler
if @DRIDefaultName <> ''
begin
select @scriptFile = @prefix_cns + @keyName + '_DRI.sql'
select @dmoMethod = 'Databases("'
+ @pDatabaseName
+ '").Tables("'
+ @tableName
+ '").Columns('
+ cast(@curColumnNb as varchar(10))
+ ').DRIDefault.Script'
exec @hr = master.dbo.sp_OAMethod @dmoServer,
@dmoMethod,
NULL,
@scriptType,
@scriptFile
if @hr <> 0 goto ErrorHandler
end
set @curColumnNb = @curColumnNb + 1
end
--Indexes
set @curIndexNb = 1
select @dmoProperty = 'Databases("'
+ @pDatabaseName
+ '").Tables("'
+ @tableName
+ '").Indexes.Count'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@indexCount OUT
if @hr <> 0 goto ErrorHandler
while @curIndexNb <= @indexCount
begin
select @dmoProperty = 'Databases("'
+ @pDatabaseName
+ '").Tables("'
+ @tableName
+ '").Indexes('
+ cast(@curIndexNb as varchar(10))
+ ').Type'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@indexType OUT
if @hr <> 0 goto ErrorHandler
-- don't script Primary Keys or Unique Constraints here
if (not(@indexType & 2048 = 2048)
and not(@indexType & 4096 = 4096))
begin
select @dmoProperty = 'Databases("'
+ @pDatabaseName
+ '").Tables("'
+ @tableName
+ '").Indexes('
+ cast(@curIndexNb as varchar(10))
+ ').Name'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@indexName OUT
if @hr <> 0 goto ErrorHandler
select @scriptFile = @prefix_ind + @indexName + '.IDX'
select @dmoMethod = 'Databases("'
+ @pDatabaseName
+ '").Tables("'
+ @tableName
+ '").Indexes('
+ cast(@curIndexNb as varchar(10))
+ ').Script'
exec @hr = master.dbo.sp_OAMethod @dmoServer,
@dmoMethod,
NULL,
@scriptType,
@scriptFile
if @hr <> 0 goto ErrorHandler
end
set @curIndexNb = @curIndexNb + 1
end
--checks
set @curCheckNb = 1
select @dmoProperty = 'Databases("'
+ @pDatabaseName
+ '").Tables("'
+ @tableName
+ '").Checks.Count'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@checkCount OUT
if @hr <> 0 goto ErrorHandler
while @curCheckNb <= @checkCount
begin
select @dmoProperty = 'Databases("'
+ @pDatabaseName
+ '").Tables("'
+ @tableName
+ '").Checks('
+ cast(@curCheckNb as varchar(10))
+ ').Name'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@checkName OUT
if @hr <> 0 goto ErrorHandler
select @scriptFile = @prefix_cns+ @CheckName + '.chk'
select @dmoMethod = 'Databases("'
+ @pDatabaseName
+ '").Tables("'
+ @tableName
+ '").Checks('
+ cast(@curCheckNb as varchar(10))
+ ').Script'
exec @hr = master.dbo.sp_OAMethod @dmoServer,
@dmoMethod,
NULL,
@scriptType,
@scriptFile
if @hr <> 0 goto ErrorHandler
set @curCheckNb = @curCheckNb + 1
end
--triggers
set @curTriggerNb = 1
select @dmoProperty = 'Databases("'
+ @pDatabaseName
+ '").Tables("'
+ @tableName
+ '").Triggers.Count'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@triggerCount OUT
if @hr <> 0 goto ErrorHandler
while @curTriggerNb <= @triggerCount
begin
select @dmoProperty = 'Databases("'
+ @pDatabaseName
+ '").Tables("'
+ @tableName
+ '").Triggers('
+ cast(@curTriggerNb as varchar(10))
+ ').Name'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@triggerName OUT
if @hr <> 0 goto ErrorHandler
select @scriptFile = @prefix_trg + @triggerName + '.trg'
select @dmoMethod = 'Databases("'
+ @pDatabaseName
+ '").Tables("'
+ @tableName
+ '").Triggers('
+ cast(@curTriggerNb as varchar(10))
+ ').Script'
exec @hr = master.dbo.sp_OAMethod @dmoServer,
@dmoMethod,
NULL,
@scriptType,
@scriptFile
if @hr <> 0 goto ErrorHandler
set @curTriggerNb = @curTriggerNb + 1
end
end
select @curTableNb = @curTableNb + 1
end
-- close and cleanup the COM/DMO database connection
exec @hr = master.dbo.sp_OAMethod @dmoServer,'DisConnect'
if @hr <> 0
goto ErrorHandler
exec @hr = master.dbo.sp_OADestroy @dmoServer
if @hr <> 0
goto ErrorHandler
-- audit completion
select * from @Activitylog
return
ErrorHandler:
insert @ActivityLog (activity) values ('Command Was :'+@Processflowerror)
if (@hr is not null)
begin
exec master.dbo.sp_OAGetErrorInfo @dmoServer,
@OleErrorSource OUT,
@OleErrorDescription OUT
insert @ActivityLog (activity)
select @procedureName + ' ' + @pDatabaseName
+ ' ended with error: ' + cast(@hr as varchar(20)) + '
OLE ERROR: '
--+ isnull(Admin.dbo.binToHex (@hr),'not defined') no function in 7 so skip conversion of error number
+ cast(@hr as varchar(20)) + '
Source: ' + isnull(@OleErrorSource,'unknown') + '
Description: ' + isnull(@OleErrorDescription,'unknown')
-- still need to cleanup
exec master.dbo.sp_OAMethod @dmoServer,'DisConnect'
exec master.dbo.sp_OADestroy @dmoServer
raiserror (59001,16,1,@procedureName)
end
else
if @cmd is not null
begin
insert @ActivityLog (activity)
select @procedureName + ' ' + @pDatabaseName
+ ' ' + isNull(@pTempFolder,'')
+ ' failed with returnstatus '
+ cast(@returnstatus as varchar(10)) + ' at: ' + @cmd
raiserror(59001,16,1,@procedureName)
end
else
raiserror (59000,16,1,@procedureName)
select * from @activitylog
return -1
GO