Good morning everybody.
I am trying to learn about Role Based Access Control and I found an understandable model:
![Model]()
But I do not know if it is o. k. to implements thiks like a role may contain other role (I know that I can do it if the roles table is hierarchyID type) I think.
1o.- Is this model enought to implements thiks like in SQL Server utility "View Dependencies"?
2o.- Is this model enought to implements thiks like in SQL Server "GRANT" and "DENY"?
If the answer is no, which changes I have to do to this model to manage those scenarios?
Here is the creation code for this model:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[users]
(
[user_id] [int] NOT NULL,
[username] [varchar](40) NOT NULL,
[password] [varchar](64) NOT NULL,
[nonce] [datetime] NOT NULL,
PRIMARY KEY CLUSTERED
(
[user_id] ASC
)
WITH
(
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE
[dbo].[users]
ADD DEFAULT
(GETDATE())
FOR
[nonce]
GO
CREATE TABLE [dbo].[roles]
(
[role_id] [int] NOT NULL,
[name] [varchar](100) NOT NULL,
PRIMARY KEY CLUSTERED
(
[role_id] ASC
)
WITH
(
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[user_role]
(
[user_id] [int] NOT NULL,
[role_id] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[user_id] ASC,
[role_id] ASC
)
WITH
(
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE
[dbo].[user_role]
WITH CHECK ADD CONSTRAINT
[role_user_role]
FOREIGN KEY
([role_id])
REFERENCES
[dbo].[roles]([role_id])
GO
ALTER TABLE
[dbo].[user_role]
CHECK CONSTRAINT
[role_user_role]
GO
ALTER TABLE
[dbo].[user_role]
WITH CHECK ADD CONSTRAINT
[user_user_role]
FOREIGN KEY
([user_id])
REFERENCES
[dbo].[users] ([user_id])
GO
ALTER TABLE
[dbo].[user_role]
CHECK CONSTRAINT
[user_user_role]
GO
CREATE TABLE [dbo].[sessions]
(
[session_id] [int] NOT NULL,
[user_id] [int] NOT NULL,
[name] [varchar](64) NOT NULL,
[created] [datetime] NOT NULL,
PRIMARY KEY CLUSTERED
(
[session_id] ASC
)
WITH
(
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE
[dbo].[sessions]
ADD DEFAULT
(GETDATE())
FOR
[created]
GO
ALTER TABLE
[dbo].[sessions]
WITH CHECK ADD CONSTRAINT
[users_sessions]
FOREIGN KEY
([user_id])
REFERENCES
[dbo].[users]([user_id])
GO
ALTER TABLE
[dbo].[sessions]
CHECK CONSTRAINT
[users_sessions]
GO
CREATE TABLE [dbo].[operations]
(
[operation_id] [int] NOT NULL,
[name] [varchar](100) NOT NULL,
PRIMARY KEY CLUSTERED
(
[operation_id] ASC
)
WITH
(
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[objects]
(
[object_id] [int] NOT NULL,
[name] [varchar](100) NOT NULL,
PRIMARY KEY CLUSTERED
(
[object_id] ASC
)
WITH
(
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[permissions]
(
[permission_id] [int] NOT NULL,
[name] [varchar](100) NOT NULL,
PRIMARY KEY CLUSTERED
(
[permission_id] ASC
)
WITH
(
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[role_permission]
(
[role_id] [int] NOT NULL,
[permission_id] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[role_id] ASC,
[permission_id] ASC
)
WITH
(
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE
[dbo].[role_permission]
WITH CHECK ADD CONSTRAINT
[permission_role_permission]
FOREIGN KEY
([permission_id])
REFERENCES
[dbo].[permissions]([permission_id])
GO
ALTER TABLE
[dbo].[role_permission]
CHECK CONSTRAINT
[permission_role_permission]
GO
ALTER TABLE
[dbo].[role_permission]
WITH CHECK ADD CONSTRAINT
[role_role_permission]
FOREIGN KEY
([role_id])
REFERENCES
[dbo].[roles]([role_id])
GO
ALTER TABLE
[dbo].[role_permission]
CHECK CONSTRAINT
[role_role_permission]
GO
CREATE TABLE [dbo].[session_role]
(
[role_id] [int] NOT NULL,
[session_id] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[role_id] ASC,
[session_id] ASC
)
WITH
(
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE
[dbo].[session_role]
WITH CHECK ADD CONSTRAINT
[role_session_role]
FOREIGN KEY
([role_id])
REFERENCES
[dbo].[roles] ([role_id])
GO
ALTER TABLE
[dbo].[session_role]
CHECK CONSTRAINT
[role_session_role]
GO
ALTER TABLE
[dbo].[session_role]
WITH CHECK ADD CONSTRAINT
[session_session_role]
FOREIGN KEY
([session_id])
REFERENCES
[dbo].[sessions] ([session_id])
GO
ALTER TABLE
[dbo].[session_role]
CHECK CONSTRAINT
[session_session_role]
GO
CREATE TABLE [dbo].[permission_operation]
(
[permission_id] [int] NOT NULL,
[operation_id] [int] NOT NULL,
CONSTRAINT
[PK_permission_operation]
PRIMARY KEY CLUSTERED
(
[permission_id] ASC,
[operation_id] ASC
)
WITH
(
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE
[dbo].[permission_operation]
WITH CHECK ADD CONSTRAINT
[operations_permission_operation]
FOREIGN KEY
([operation_id])
REFERENCES
[dbo].[operations]([operation_id])
GO
ALTER TABLE
[dbo].[permission_operation]
CHECK CONSTRAINT
[operations_permission_operation]
GO
ALTER TABLE
[dbo].[permission_operation]
WITH CHECK ADD CONSTRAINT
[permissions_permission_operation]
FOREIGN KEY
([permission_id])
REFERENCES
[dbo].[permissions] ([permission_id])
GO
ALTER TABLE
[dbo].[permission_operation]
CHECK CONSTRAINT
[permissions_permission_operation]
GO
CREATE TABLE [dbo].[object_permission]
(
[object_id] [int] NOT NULL,
[permission_id] [int] NOT NULL,
CONSTRAINT [PK_object_permission] PRIMARY KEY CLUSTERED
(
[object_id] ASC,
[permission_id] ASC
)
WITH
(
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE
[dbo].[object_permission]
WITH CHECK ADD CONSTRAINT
[objects_object_permission]
FOREIGN KEY
([object_id])
REFERENCES
[dbo].[objects] ([object_id])
GO
ALTER TABLE
[dbo].[object_permission]
CHECK CONSTRAINT
[objects_object_permission]
GO
ALTER TABLE
[dbo].[object_permission]
WITH CHECK ADD CONSTRAINT
[permissions_object_permission]
FOREIGN KEY
([permission_id])
REFERENCES
[dbo].[permissions] ([permission_id])
GO
ALTER TABLE
[dbo].[object_permission]
CHECK CONSTRAINT
[permissions_object_permission]
GO
--DROP TABLE [dbo].[object_permission]
--GO
--DROP TABLE [dbo].[permission_operation]
--GO
--DROP TABLE [dbo].[session_role]
--GO
--DROP TABLE [dbo].[role_permission]
--GO
--DROP TABLE [dbo].[permissions]
--GO
--DROP TABLE [dbo].[objects]
--GO
--DROP TABLE [dbo].[operations]
--GO
--DROP TABLE [dbo].[sessions]
--GO
--DROP TABLE [dbo].[user_role]
--GO
--DROP TABLE [dbo].[roles]
--GO
--DROP TABLE [dbo].[users]
--GO
Thanks a lot for your valuable help.
Regards,
Jamesit0