verify_sysusages
IF EXISTS (SELECT * FROM sysobjects
WHERE id = OBJECT_ID('dbo.verify_sysusages')
AND sysstat & 0xf = 4)
DROP PROCEDURE dbo.verify_sysusages
GO
CREATE PROCEDURE verify_sysusages
@dbName VARCHAR(30) = ' ', -- the database name on both systems
@source VARCHAR(30) = ' ', -- the source server name
@sourcePassword VARCHAR(30) = ' ',-- sa password on source
@target VARCHAR(30) = ' ', -- the target server name
@targetPassword VARCHAR(30) = ' ',-- sa password on target
@saPassword VARCHAR(30) = ' ', -- sa password on admin server
@loadPath VARCHAR(50) = ' ', -- fully qualified load path
@mailTo VARCHAR(30) = 'DBA', -- address to mail debug info
@debug VARCHAR(5) = 'false' -- debug this procedure
AS
/*
Procedure verify_sysusages compares the size allocated in
master..sysusages for two databases and reports if they are
not the same size. Note that the database must have the same
name in both locations (so they have to be on different
SQL Servers).
*/
DECLARE
@CMD VARCHAR(255), -- reusable command holder
@CMDstatus INT, -- return status of command prompt
@myName VARCHAR(30) -- name of this function
SET NOCOUNT ON
SELECT @myName = 'admin.verify_sysuasges'
IF (@dbName <> ' ')
AND (@source <> ' ')
AND (@target <> ' ')
AND (@loadPath <> ' ')
BEGIN
SELECT @CMD = "SELECT SUM(size) FROM master..sysusages WHERE dbid = DB_ID('" +
@dbName + "')"
SELECT @CMD = 'isql -Usa -P' + @sourcePassword + ' -S' + @source + ' -Q"' +
@CMD + '" -o' + @loadpath + '\' + @source + @dbName + '.siz'
EXEC @CMDstatus = dispatch @CMD, @myName, @debug
IF (@CMDstatus <> 0) return @CMDstatus
SELECT @CMD = "SELECT SUM(size) FROM master..sysusages WHERE dbid = DB_ID('" +
@dbName + "')"
SELECT @CMD = 'isql -Usa -P' + @targetPassword + ' -S' + @target + ' -Q"' +
@CMD + '" -o' + @loadpath + '\' + @target + @dbName + '.siz'
EXEC @CMDstatus = dispatch @CMD, @myName, @debug
IF (@CMDstatus <> 0) return @CMDstatus
DELETE messenger WHERE spid = @@SPID
EXEC hold_semaphore 'textreader'
TRUNCATE TABLE textreader
SELECT @CMD = 'bcp admin..textreader in ' + @loadPath +
'\' + @source + @dbName + '.siz -c -Usa -P' +
@saPassword + ' -S' + @@SERVERNAME
EXEC @CMDstatus = dispatch @CMD, @myName, @debug
IF (@CMDstatus <> 0) return @CMDstatus
SELECT @CMD = 'bcp admin..textreader in ' + @loadPath +
'\' + @target + @dbName + '.siz -c -Usa -P' +
@saPassword + ' -S' + @@SERVERNAME
EXEC @CMDstatus = dispatch @CMD, @myName, @debug
IF (@CMDstatus <> 0) return @CMDstatus
INSERT messenger
SELECT @@SPID,
text
FROM textreader
WHERE text NOT LIKE " -%"
AND text NOT LIKE "(1 %"
AND text NOT LIKE " "
AND text IS NOT NULL
TRUNCATE TABLE textreader
EXEC release_semaphore 'textreader'
SELECT @CMD = 'isql -Usa -P' + @targetPassword + ' -S' + @target +
' -dmaster -Q"master..xp_cmdshell ' + "'del " +
@loadPath + "\*.siz'" + '"'
EXEC @CMDstatus = dispatch @CMD, @myName, @debug
IF (@CMDstatus <> 0) return @CMDstatus
IF EXISTS (SELECT info FROM messenger
WHERE spid = @@SPID
AND ISNUMERIC(info) = 0)
BEGIN
SELECT @CMD = 'An error occurred while checking the size of database '
+ @dbName + ' on ' + @source + ' and ' + @target + '. ('
+ @myName + ')'
EXEC @CMDstatus = dispatch @CMD, @myName, @debug
IF (@CMDstatus <> 0)
BEGIN
SELECT @CMD = "SELECT * FROM admin.dbo.messenger WHERE spid = "
+ CONVERT(VARCHAR(5),@@SPID)
EXEC master..xp_sendmail @mailTo,
'admin.verify_sysusages error info',
@query = @CMD
RETURN @CMDstatus
END
DELETE messenger where spid = @@SPID
RETURN 99
END
IF NOT EXISTS (SELECT * FROM messenger
WHERE spid = @@SPID
GROUP BY info
HAVING COUNT(*) > 1)
BEGIN
IF @debug = 'true'
BEGIN
SELECT @CMD = "SELECT * FROM admin.dbo.messenger WHERE spid = "
+ CONVERT(VARCHAR(5),@@SPID)
EXEC master..xp_sendmail @mailTo,
'admin.verify_sysusages debug info',
@query = @CMD
END
SELECT @CMD = 'The ' + @source + ' and ' + @target + ' ' + @dbName +
' databases are not the same size. (' + @myName + ')'
EXEC @CMDstatus = dispatch @CMD, @myName, @debug
IF (@CMDstatus <> 0) return @CMDstatus
DELETE messenger where spid = @@SPID
RETURN 99
END
DELETE messenger WHERE spid = @@SPID
RETURN
END
ELSE
BEGIN
PRINT " usage: verify_sysusages"
PRINT " [@dbname = <database name> ],"
PRINT " [@source = <source SQL Server> ],"
PRINT " [@sourcePassword = <source sa password> ],"
PRINT " [@target = <target SQL Server> ],"
PRINT " [@targetPassword = <target sa password> ],"
PRINT " [@saPassword = <admin sa password> ],"
PRINT " [@loadPath = <target restore path> ],"
PRINT " [@debug = <debug - default=false> ],"
RETURN 1
END
GO