I have a schema called training
. I have a new role called training_modify
. Here are the desired permissions for users placed in that role:
- Select, update, insert, and delete permissions on any object in that schema
- Create any object in that schema
- Drop any object in that schema
- No permissions on any other object outside that schema (except for those granted through the
public
role - No create/drop/alter permissions for the schema itself
- The role and individual users should not require membership in
db_ddladmin
,db_datareader
,db_datawriter
, or any other default security roles
In simple terms, I want the users in the role to be able to do anything they want within the schema without affecting/seeing anything outside the schema or the schema itself. What is the least privilege to grant this type of access?
My approach so far:
- Create
training
schema withdbo
as the owner - Create
training_modify
role withdbo
as the owner - Grant all permissions on the schema to the role
- Grant create objects to the role
- Add a user to the role
Here is the code for the above steps:
CREATE SCHEMA training AUTHORIZATION dbo;
CREATE ROLE training_modify AUTHORIZATION dbo;
GRANT ALTER, DELETE, EXECUTE, INSERT, REFERENCES, SELECT,
UPDATE, VIEW DEFINITION ON SCHEMA::training TO training_modify;
GRANT CREATE TABLE, CREATE PROCEDURE, CREATE FUNCTION, CREATE VIEW TO training_modify;
EXEC sp_addrolemember 'training_modify', 'example_user';
Is this the right approach? Does it have any unintended consequences? I am most worried about how ownership chaining may affect this approach negatively with dbo
being the owner of the schema and the role (as well as other schemas/objects in the DB), and the alter permission being granted on the schema.
Also:
- Should
dbo
still own the role? or shouldTestOwner
own both the role and the schema? - Is it accurate that if I took away the
CREATE PROCEDURE
andCREATE FUNCTION
permissions, this would prevent any DML on objects outside the specific schema? I don't think I care if they can create procedures, although I would like them to be able to execute procedures/functions (which I think would be covered by theEXECUTE
permission on the schema). If this is accurate - are there any pros/cons between this approach and changing the owner of the schema?
INSERT
,UPDATE
, andDELETE
),SELECT
, andEXECUTE
operations. It does not allow forCREATE
,ALTER
,DROP
, etc.SELECT
, orEXECUTE
objects owned bydbo
that are outside of thetraining
schema? I've read about ownership chaining a lot, but still haven't been able to get it through my dense skull.dbo.
objects, then just change the owner of thetraining
schema to betraining_modify
. That might reduce the need for the other permissions on the schema itself. But it might allow for something else. I would have to check the doc, and I don't have time right now. Worst case, just create another user namedtraining_owner
and assign ownership oftraining
schema to that user. Then you don't have to worry aboutdbo.
stuff.training
schema being owned bydbo
and thetraining
schema allowing users to create their own procedures (in thetraining
schema), a person could just create a procedure to do DML /SELECT
ondbo.
objects. And then I created a new user and made them the owner of the new schema::CREATE USER [TestOwner] WITHOUT LOGIN; ALTER AUTHORIZATION ON SCHEMA::[Test] TO [TestOwner];
, and that seems to prevent that access, as I suggested earlier.dbo
still own the role? or shouldTestOwner
own both the role and the schema? when I altered the authorization on the schema, the user in the role seemed to lose all permissions, regardless of whetherdbo
orTestOwner
owned the role.