join the MSSQLTips community

Today's Site Sponsor


 

Cure SQL Server performance headaches with NEW SQL doctor. Try the BETA and enter to win an iPad!
 



SQL Server permissions and security auditing: Idera SQL secure

Breaking ownership chaining within a schema in SQL Server

Written By: K. Brian Kelley -- 8/11/2009 -- read/post comments -- print -- Bookmark and Share

Rating: (not rated yet) Rate

Problem
I have several objects, all in the same schema. Because of this, ownership chaining is working, as described in this previous tip. However, I don't want ownership chaining to be on, but I need the objects to remain in the same schema. How can I do this?

Solution
In SQL Server 2005/2008, the objects we typically work with, like tables, views, and stored procedures, are contained in a schema. All schemas have owners, but the objects they contain, by default, do not have owners. For instance, the table MyTable sitting in the MySchema schema doesn't have an owner, but the MySchema schema does. In these cases, SQL Server takes the owner of the schema and treats that as the owner of the object. So consider the case where you have the following objects: a table, MyTable, which is referred to by a stored procedure, MyProc.

Let's set up the scenario:

USE MSSQLTips;
GO

-- Create a schema to hold our objects
CREATE SCHEMA MySchema AUTHORIZATION dbo;
GO

-- Create a user to test with
CREATE USER TestUser 
WITHOUT LOGIN
WITH DEFAULT_SCHEMA MySchema;
GO

-- Create a role to assign permissions to
CREATE ROLE TestRole;
GO

-- Add the user to the role
EXEC sp_addrolemember 'TestRole''TestUser';
GO

And let's create the objects in the MySchema schema:

-- Create objects to show ownership chaining
CREATE TABLE MySchema.MyTable (TableInt INT);
GO

CREATE PROCEDURE MySchema.MyProc 
AS
BEGIN
  SELECT 
TableInt FROM MySchema.MyTable;
END;
GO

GRANT EXECUTE ON MySchema.MyProc TO TestRole;
GO

Now, if we execute as TestUser, we'll see that the stored procedure works, because there is an ownership chain.

-- script 3
EXECUTE AS 
USER 'TestUser';
GO 

EXEC MySchema.MyProc;
GO

REVERT
;
GO

This is because neither MyTable nor MyProc has a specified owner. As a result, SQL Server is using the owner of the schema as the owner of both objects. Since the owner is therefore one and the same, dbo, for both objects, the ownership chain forms.  Here is the result for running this query.  Note: the result set is empty, because we did not insert any rows into the table.

Ownership Chain - Stored Procedure Works

If we want the ownership chain to be broken, we need to change the owner of either the table or the stored procedure to something other than dbo, since that's the owner of the schema. We can accomplish this by either using an existing user in the database or by creating a new one and then executing an ALTER AUTHORIZATION on one of the two objects. For instance:

CREATE USER SecondOwner WITHOUT LOGIN;
GO

ALTER AUTHORIZATION ON OBJECT::MySchema.MyTable TO SecondOwner;
GO 

And now if we go back and execute the code from script 3 again as TestUser, we'll get an error. This is because there is no longer an ownership chain in effect and the TestUser database principal does not have SELECT permissions against the table:

Ownership chain is broken

Also, if we look in SQL Server Management Studio we can see the objects are still in the same schema.

So simply by changing the owner for one of the objects using ALTER AUTHORIZATION, we can break the ownership chain. This should be used with caution, however, as it is easy to overlook this when troubleshooting why something doesn't work since we're so used to having all objects within a given schema "owned" by the schema owner. Also, if the need is to only break the ownership chain on a handful of referring objects, like a few of the stored procedures, then the owner on them should be changed and not the referred to object (the table). This will ensure that other objects referencing the table will still use ownership chaining and will minimize the changes you'll need to make.

Next Steps

Readers Who Read This Tip Also Read Free Live Webcast Comment or Ask Questions About This Tip



Get Our Tips Newsletter

We keep 50,000+ SQL Server professionals informed.

Idera - SQL secure

Idera SQL secure collects and analyzes permissions data from SQL Server and Active Directory as well as the file system and registry to show who has access to what database objects and how that access is granted. SQL secure also monitors changes made to access rights so that unapproved changes can be easily identified and fixed. SQL secure also collects and evaluates key security settings within SQL Server and provides proactive recommendations to improve server security.

Download now!



More SQL Server Tools
SQL Data Generator

SQL Backup

SQL Compare

SQL safe backup

SQL diagnostic manager


Sponsor Information
Free SQL Server performance monitoring dashboard – Idera SQL check

Try Red Gate SQL Backup Pro for smaller, more robust SQL Server backups. Download a free trial now!

SQL Server Issues? Not sure where to turn for answers? Innovative SQL DBA consultants

Looking for SQL Server interview questions and answers?

Free white paper - Top SQL Server Backup Mistakes and How to Avoid Them



Copyright (c) 2006-2010 Edgewood Solutions, LLC All rights reserved
privacy statement | disclaimer | copyright | advertise | write for mssqltips | feedback | about
Some names and products listed are the registered trademarks of their respective owners.


CareerQandA.com | MSSharePointTips.com | MSSQLTips.com