Wednesday, May 5, 2010
Properties and other dialogs failing in SSMS
TITLE: Microsoft SQL Server Management Studio
------------------------------
Cannot show requested dialog.
------------------------------
ADDITIONAL INFORMATION:
Cannot show requested dialog. (SqlMgmt)
------------------------------
There is no row at position 0. (System.Data)
Problem is to do with system table spt_values being deleted.
Run this script to repair - the location may be different on your server.
C:\Program Files\Microsoft SQL Server\MSSQL\MSSQL.1\install\u_tables.sql
Remove a File and Filegroup from Database
Before a filegroup can be removed all files associated with it need to be deleted.
Before a file can be deleted all objects associated with it need to be removed.
Just removing a file not a filegroup
If you have multiple files on a filegroup and you just want to get rid of one you can run this command.
DBCC ShrinkFile(logical_file_name,EmptyFile);
This will move any objects in the file onto the other files in the filegroup. You can then delete the file.
ALTER DATABASE DatabaseName REMOVE FILE logical_file_name;
Removing a file and a filegroup
To do this you will have to make sure that here are no objects associated with the file group. This could be Tables etc, Indexes, or even Blob objects.
This bit of code will show you the objects on a file group.
SELECT o.[name], o.[type], i.[name], i.[index_id], f.[name]
FROM sys.indexes i
INNER JOIN sys.filegroups f
ON i.data_space_id = f.data_space_id
INNER JOIN sys.all_objects o
ON i.[object_id] = o.[object_id]
WHERE i.data_space_id = f.data_space_id
AND o.type = 'U' -- User Created Tables
I got this from:
http://blog.sqlauthority.com/2009/06/01/sql-server-list-all-objects-created-on-all-filegroups-in-database/
If there are objects you want to keep you will need to move them to another filegroup. To move a non-clustered index you will need to drop and recreate it on the new file group. To move a table you need to drop and recreate the clustered index.
Once the filegroup has no user objects empty you can run the same commands for removing a file as – shrinkfile and remove file.
Then you will need to run the code below to drop the filegroup:
DATABASE [databaseName] REMOVE FILEGROUP [Filegroupname];
Remember: you can not drop the Primary filegroup.
Friday, April 30, 2010
Table Diff: Compare the contents of two tables
Table diff will let you compare two tables and generate a change script to sync them up.
By default it is installed here:
"C:\Program Files\Microsoft SQL Server\90\COM\tablediff.exe"
In this example I am comparing two tables in the same database called Live_Support. The tables are LF29699_Orig and LF29699_New.
I have created a batch file called comapretables.cmd.
The contents of the table looks like this:
"C:\Program Files\Microsoft SQL Server\90\COM\tablediff.exe" -sourceserver sqlmgmt1 -sourcedatabase Live_Support -sourcetable LF29699_Orig -destinationserver sqlmgmt1 -destinationdatabase colt_Live_Support -destinationtable LF29699_new -f c:\LF29699_diff.sql
Execute this and you get a file c:\LF29699_diff.sql which is a change script for that table:
-- Host: sqlmgmt1
-- Database: [Live_Support]
-- Table: [dbo].[LF29699_new]
SET IDENTITY_INSERT [dbo].[LF29699_new] ON
UPDATE [dbo].[LF29699_new] SET [GroupIndex]=3 WHERE [pkid] = 3
UPDATE [dbo].[LF29699_new] SET [GroupIndex]=2 WHERE [pkid] = 683
SET IDENTITY_INSERT [dbo].[LF29699_new] OFF
You can see from the script that there are 2 differences between the tables. It does not tell you what the values in the table are currently; you do have the primary key value though so you can look it up.
The two tables you compare will need to have primary keys defined on them.
BOL tableDiff.Exe: 'http://msdn.microsoft.com/en-us/library/ms162843.aspx
Friday, April 23, 2010
Replication Error - Login Failure
This will show up in the SQL Error Logs as:
Login failed for domain\username
Followed by
Error: 18456, Severity: 14, State: 6
The error code means that a windows log-in was entered in the place of a SQL log-in. In the case I had it was in the Log Agent Reader security.
In the section connect to publisher I had entered a windows service account (although it says quite clearly here: using the following SQL Server Login). I didn’t see this though as I added replication through a script which I had adapted.
Monday, April 19, 2010
SQL Cursors
I had thought that if an item came within teh scope of a cursor it would remain there until removed. However, cursors work a little like views, if you cange a value which would remove an item from a view you will no longer see it in the view. If you change the value of a data row which would put it outside the scope of teh cursor the cursor will drop that row.
This was tested on SQL 2005 sp3 – I assume it will be the same on other versions but I haven’t tested them.
I have a simple table:
CREATE TABLE [dbo].[test](
[pkid] [int] IDENTITY(1,1) NOT NULL,
[descript] [varchar](5) NOT NULL,
[value1] [int] NOT NULL,
[value2] [int] NOT NULL,
CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED
(
[pkid] ASC
);
The table has 3 rows:
| Pkid | descript | value1 | value2 |
| 1 | test1 | 0 | 0 |
| 2 | test2 | 0 | 0 |
| 3 | test1 | 0 | 0 |
I then execute this script against the table:
Declare @dbName as varchar(5);
Declare @x as int;
Set @x = 1;
DECLARE dbCursor CURSOR Local Fast_Forward FOR
select descript From dbo.Test
WHERE value2 = 0;
OPEN dbCursor
FETCH NEXT FROM dbCursor INTO @dbName
WHILE @@FETCH_STATUS = 0
BEGIN
Print @dbName
Update dbo.Test
Set value2 = @x
Where descript = @dbname;
Set @x = @x+1;
FETCH NEXT FROM dbCursor INTO @dbName;
END
CLOSE dbCursor;
DEALLOCATE dbCursor;
The results in the table are:
| Pkid | descript | value1 | value2 |
| 1 | test1 | 0 | 1 |
| 2 | test2 | 0 | 2 |
| 3 | test1 | 0 | 1 |
This shows that because the value2 value of pkid 3 changed from 0 to 1 on the first update it dropped out of the cursors scope.
Tuesday, March 23, 2010
Moving System Databases: SQL Server 2000 and 2005
Notes
Tempdb is built when ever the sql server restarts so you tell it where you want the database then restart sql and it will build the database there. You will then need to delete the old files.
In SQL 2005 the resource database log and data file have to go into the same directory as the master data file.
sp_helpfile will show you where the database files are – good to run after the change to check they are where you think they are.
Move Tempdb
Run the script below using the correct path for the server:
USE master;
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = templog, FILENAME = 'F:\SQLLogs\templog.ldf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev, FILENAME = 'E:\SQLData\tempdb.mdf');
GO
For this next step you can wait and do the stop /start for msdb
Next stop Sql Server
Restart SQL Server
Go back and delete the old files
Move Model and MSDB Files
First run this – with the filename being the path required
ALTER DATABASE Model MODIFY FILE (NAME = modellog, FILENAME = 'F:\SQLLogs\modellog.ldf');
Go
ALTER DATABASE MSDB MODIFY FILE (NAME = MSDBLog, FILENAME = 'F:\SQLLogs\msdblog.ldf');
Go
ALTER DATABASE Model
MODIFY FILE (NAME = modeldev, FILENAME = 'E:\SQLData\model.mdf');
Go
ALTER DATABASE MSDB
MODIFY FILE (NAME = MSDBData, FILENAME = 'E:\SQLData\msdbdata.mdf');
go
Stop Sql Server
Move the files
Restart SQL Server
Move Master and Resource Log
1. From the Start menu, point to All Programs, point to Microsoft SQL Server 2005, point to Configuration Tools, and then click SQL Server Configuration Manager.
2. In the SQL Server 2005 Services node, right-click the instance of SQL Server (for example, SQL Server (MSSQLSERVER)) and choose Properties.
3. In the SQL Server (instance_name) Properties dialog box, click the Advanced tab.
4. Edit the Startup Parameters values to point to the planned location for the master database data and log files, and click OK. Moving the error log file is optional.
The parameter value for the data file must follow the -d parameter and the value for the log file must follow the -l parameter.
5. Stop the instance of SQL Server by right-clicking the instance name and choosing Stop.
6. Move the master.mdf and mastlog.ldf files to the new location.
7. Start the instance of SQL Server in master-only recovery mode by entering one of the following commands at the command prompt. The parameters specified in these commands are case sensitive. The commands fail when the parameters are not specified as shown.
1. For the default (MSSQLSERVER) instance, run the following command.
NET START MSSQLSERVER /f /T3608
2. For a named instance, run the following command.
NET START MSSQL$instancename /f /T3608
8. Using sqlcmd commands or SQL Server Management Studio, run the following statements. Change the FILENAME path to match the new location of the master data file. Do not change the name of the database or the file names.
Save the script into a file called c:\move.sql (make sure the paths are right for your server NOTE the ldf and mdf go to the same location as the master mdf
ALTER DATABASE mssqlsystemresource MODIFY FILE (NAME=log, FILENAME=
'E:\SQLData\mssqlsystemresource.ldf');
ALTER DATABASE mssqlsystemresource MODIFY FILE (NAME=data, FILENAME=
'E:\SQLData\mssqlsystemresource.mdf');
Now run sqlcmd
"C:\Program Files\Microsoft SQL Server\90\tools\binn\SQLCMD.EXE" -E -S . -d master /i c:\move.sql
1. Move the files to the new location.
2. Set the Resource database to read-only by running the following statement.
ALTER DATABASE mssqlsystemresource SET READ_ONLY;
1. Stop the instance of SQL Server.
2. Restart the instance of SQL Server using the sqlcmd this time without the flags /f /t3608
3. Check file and log locations:
SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
Moving System Databases in SQL Server 2000
Moving the Master Database
The location of the master database and its associated log can be changed from within SQL Server Enterprise Manager. To do this:
Open SQL Enterprise Manger and drill down to the proper database server.
Right-click the SQL Server in Enterprise Manager and click Properties.
Click the Startup Parameters button and you will see something similar to the following entries:
-dC:\MSSQL\data\master.mdf
-eC:\MSSQL\log\ErrorLog
-lC:\MSSQL\data\mastlog.ldf
Change these values as follows:
Remove the current entries for the Master.mdf and Mastlog.ldf files.
Add new entries specifying the new location:
-dE:\SQLData\master.mdf
-lL:\SQLLogs\mastlog.ldf
Stop SQL Server.
Copy the Master.mdf and Mastlog.ldf files to the new locations
Restart SQL Server.
Moving MSDB and Model
When you are using this procedure to move the msdb and model databases, the order of reattachment must be model first and then msdb.
To move the MSDB follow these steps:
In SQL Server Enterprise Manager, right-click the server name and click Properties. On the General tab, click Startup Parameters.
Add a new parameter as -T3608. Select OK to close the Startup Parameters and the Properties page. You will not be able to access any user databases at this time. You should not perform any operations other than the steps below while using this trace flag.
Drill down to the msdb database and then right click on it. Select Properties and then select the Options tab.
Select Restrict access and then Single User. Close the Properties sheet by selecting OK.
Stop and then restart SQL Server.
Open SQL Query Analyzer and then detach the msdb database using the following commands:
use master
go
sp_detach_db 'msdb'
go
Move the Msdbdata.mdf and Msdblog.ldf files from the current location to the new location.
Reattach the MSDB database as using the following commands:
use master
go
sp_attach_db 'msdb','E:\SQLData\msdbdata.mdf','L:\SQLLogs\msdblog.ldf';
go
Remove the -T3608 trace flag from the Startup Parameters box in the SQL Enterprise Manager.
Stop and then restart SQL Server.
Moving Tempdb
*** This is the same as the SQL 2005 method ***
Run the script below using the correct path for the server:
USE master;
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = templog, FILENAME = 'F:\SQL_Logs\templog.ldf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev, FILENAME = 'E:\SQL_Data\tempdb.mdf');
GO
Next stop Sql Server
Restart SQL Server
Go back and delete the old files
Monday, March 15, 2010
Replication failed between two 2000 machines: server execution failed
The error that was showing stated: server execution failed
Ran the snapshot replication agent from the command line.
To do this go to the sql folder with snapshot.exe In this case C:\Program Files\Microsoft SQL Server\80\COM
Then run snapshot.exe followed by the string found in the second step of the start agent job. In this case: -Publisher [Server2Name] -PublisherDB [replictedDatabaseName] -Distributor [Server2Name] -Publication [nameOfPublication] -DistributorSecurityMode 1
This then generated the real error: ATL71.Dll was missing from – series of directories all defined by PATH.
I did a search and found this dll in the temp directory. I copied it to system32 and re ran the agents.
They are now distributing transactions. It took a while to catch back up again though.