In this article I will show how can we get the list of all the objects (table, Procedure, view or user defined function) owned by non DBO users. I believe this occurred most on Development server where developers doesn’t have DBO rights in Database. To get the list of object we need to create below table and procedure.
Step 1:Create table ObjList using below script:
CREATE TABLE [ObjList] ( [DBName] [sysname] NOT NULL , [Object_Type] [varchar] (20) NULL , [ObjectOwner] [sysname] NOT NULL , [ObjectName] [sysname] NOT NULL , [cur_date] [datetime] NOT NULL CONSTRAINT [DF_ObjList_cur_date] DEFAULT (getdate()) ) ON [PRIMARY] GO
Step 2: Create Procedure Object_owned_by_non_dbo using below script
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
Create Procedure Object_owned_by_non_dbo
as
declare @dbname varchar(200)
declare @mSql1varchar(8000)
Set nocount on
DECLARE DBName_Cursor CURSOR FOR
select name
from
master.dbo.sysdatabases
where name not in ('master','msdb','tempdb')
Order by name
OPEN DBName_Cursor
FETCH NEXT FROM DBName_Cursor INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
Set @mSql1 = 'Insert into ObjList (DBName, Object_Type, ObjectOwner,ObjectName)'+char(13)
Set @mSql1 = @mSQL1+'Select '''+@dbname+''' as dbName,ObjType =
Case xtype
when ''u'' then ''Table''
when ''V'' then ''View''
when ''P'' then ''Procedure''
when ''FN'' then ''UD Function''
else xtype end
, SU.name,SO.name from '+@dbname+'.dbo.sysobjects SO join '+@dbname+'.dbo.sysusers SU
on SO.uid = SU.uid and su.name <> ''dbo''
and SO.xtype in (''u'',''v'',''p'',''FN'')'
--Print @mSql1
Execute (@mSql1)
FETCH NEXT FROM DBName_Cursor INTO @dbname
END
CLOSE DBName_Cursor
DEALLOCATE DBName_Cursor
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
Step 3:Please execute the below script to retrieve the list.
Select * from ObjList DBName Object_Type ObjectOwner ObjectName cur_date ---------- ------------ ------------- ---------------- ----------------------- Database1 UD Function Userv1 IS_FIELD_IN 2004-10-29 16:42:39.127 Database2 Table Domain1\NT1 Vendor_Top200 2004-10-29 16:42:39.813 Database2 Table Domain1\NT1 Supplier_Top200 2004-10-29 16:42:39.813 Database2 Table Domain1\NT1 Emp_Top200 2004-10-29 16:42:39.813
Step 3:We can confined the list for specific user or database as below:
Select * from ObjList where DBName = 'Database1' DBName Object_Type ObjectOwner ObjectName cur_date ---------- -------------- -------------- ----------------- ----------------------- Database1 UD Function Userv1 IS_FIELD_IN 2004-10-29 16:42:39.127
Or
Select * from ObjList where ObjectOwner = 'Domian1\NT1'DBName Object_Type ObjectOwner ObjectName cur_date
---------- -------------- -------------- --------------- -----------------------
Database1 UD Function Userv1 IS_FIELD_IN 2004-10-29 16:42:39.127
Database2 Table Domain1\NT1 Vendor_Top200 2004-10-29 16:42:39.813
Database2 Table Domain1\NT1 Supplier_Top200 2004-10-29 16:42:39.813
Database2 Table Domain1\NT1 Emp_Top200 2004-10-29 16:42:39.813
I think you will like this procedure. Please don’t forget to send me your comments on this article.