We're using stored procedures to restrict the access of some of our database users. They need access to specific parts of the database (not just tables/views, but also specific rows), and the sproc should check if the user is allowed to see the table rows he's requesting.
To store the authorization rules, we're planning to use a table dbo.AuthRules
like that:
|ID|UserId |AccessFrom |AccessTo | ...
===============================================
| 1| 1| 01.01.2013 | 31.12.2013 | ...
| 2| 2| 31.05.2012 | 31.12.2015 | ...
The stored procedure would then query that table to check if the current user has access to the requested data. To make it clear: We cannot just use GRANT PERMISSION
because we need fine-grained access rules down to the rows in the DB.
We're not sure about the UserId
column. The best solution would be some kind of foreign key to the system view sys.database_principals
, but there are no foreign keys to views.
- Should we just store the
principal_id
column ofsys.database_principals
, without any constraint? - Would it be better to store the
name
column instead ofprincipal_id
? - Are there other options to store a reference to the DB user?