January 24, 2007 at 11:47 am
I have an issue that I need to resolve.
We recently had one of our SQL Server DBAs leave the company and now I am tasked with trying to locate any objects that he may have created (databases, tables, stored procedures, etc.) during his time here.
I need to write a query that I can run on each of our servers (close to 100 mostly SQL Server 2000 with a few SQL Server 2005) that goes through all the databases and returns any object owned by any form of his login (ex: jon, john, johnny, jonathan).
The long term goal is once all the objects have been identified would be to change ownership to the sa account.
I am a fairly new DBA so please bear with me.
I can get the list of logins from the Master database via the sysxlogins table.
I also see each database has a sysobjects table but I do not see any specific object names and any correlation to the sysxlogins table.
Any help would be greatly appreciated!
Thanks.
January 24, 2007 at 12:27 pm
Here's how we do it.
1. Pick a server that will be your 'reporting' server.
2. Created linked servers from the reporting server to all the other servers.
3. Create a table called tServer with ServerID and ServerName columns at a minimum.
4. Create a table called tLogin with ServerName and Login columns.
5. Create this UDF.
CREATE FUNCTION dbo.udfGetServer(@id AS INT)
RETURNS VARCHAR(20)
AS
BEGIN
DECLARE @value VARCHAR(20)
SET @value = ''
SELECT @value = @value + CONVERT(VARCHAR(20), ServerName)
FROM dbo.tServer
WHERE ServerId = @id
ORDER BY ServerName
Return @value
END
6. Create this stored procedure.
CREATE PROCEDURE dbo.spGetPersonsObjects
@personlogin VARCHAR(10)
AS
/*
File Name: spGetPersonsObjects.sql
Created By: William Fleming
Created: 3 November 2006
Purpose: This script will return all objects owned by the
login entered as a variable.
*/
BEGIN
DECLARE @ServerID CHAR(5),
@login VARCHAR(50),
@ServerName VARCHAR(30),
@ServerCount INT,
@ServerPosition INT,
@FullName VARCHAR(30),
@FullName1 VARCHAR(30),
@FullName2 VARCHAR(300),
@string VARCHAR(2000)
SELECT @ServerCount=MAX(ServerID) + 1
FROM tServer
SELECT @ServerPosition = 0
BEGIN
WHILE @ServerPosition < @ServerCount
BEGIN
SELECT @FullName=dbo.udfGetServer (@ServerPosition)
IF @FullName = ''
WHILE @FullName = ''
BEGIN
SET @ServerPosition=@ServerPosition +1
SELECT @FullName=dbo.udfGetServer (@ServerPosition)
END
SELECT @FullName1 = @FullName
SET @FullName2 = '['+ rtrim(@FullName1) + '].master.dbo.syslogins j'
SET @serverID = @serverposition
SET @string = 'INSERT tLogins ' + 'SELECT '''+ @FullName + ''', j.name
FROM '+ @FullName2 + ' ORDER BY j.name'
--PRINT @string
EXEC (@string)
SET @ServerPosition=@ServerPosition +1
End
End
END
GO
7. Add your server information to tServer.
8. Run the stored procedure. If you want to test it, comment out the EXEC(@string) line and uncomment the PRINT @string line.
-SQLBill
January 24, 2007 at 12:45 pm
Hi John,
This is a slightly confusing area with in SQL Server (but for a good reason) - Users and Logins are different things.
A login may be a Windows User with access rights granted in the SQL Server or it may be a SQL Server login such as sa. These are detailed in the syslogins table.
A user is database specific and a login can be mapped to it within a database. It is used to control access and ownership of objects within a database and independently of a login. (Two or more logins may map to the same user).
A user owns a database object rather than a login. This is normally the dbo user. http://www.sqlservercentral.com/columnists/nboyle/fixingbrokenlogins.asp details where the information for mapping logins to users in a database is stored.
So you can find all objects owner by a user within a database using sysobjects and sysusers but Im not sure finding all of the objects created by a login regardless of the user within a database is possible.. it might be though
Hope this gets you on your way,
- James
--
James Moore
Red Gate Software Ltd
January 24, 2007 at 2:10 pm
Thanks for the responses gentlemen!
I will put this knowledge into use tomorrow and see how I make out.
Thank you both for taking the time to help me out- it is much appreciated!!!
Viewing 4 posts - 1 through 3 (of 3 total)
You must be logged in to reply to this topic. Login to reply