Я занимаюсь разработкой относительно простой базы данных, которая будет управлять пользователями, оборудованием и программным обеспечением на заводе.
Я не специалист по темам баз данных.Ниже приведен фрагмент базы данных:
https://i.stack.imgur.com/I0BD7.png
Я решил всегда использовать целочисленный суррогатный ключ, даже если такие поля, как логин или привилегия, уникальны.
Эта база данных будетиспользуется многими типами программного обеспечения, которые не всегда имеют приличный ORM, и я решил взаимодействовать с БД с помощью StoredProcedures
Мой вопрос касается хранимых процедур и их параметров.Например, usp_AddUserRole можно определить следующим образом:
IF NOT EXISTS (select * from dbo.sysobjects where id = object_id(N'[User].[usp_AddUserRole]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
EXEC
('CREATE PROCEDURE [User].[usp_AddUserRole] AS SET NOCOUNT ON')
GO
GRANT EXECUTE ON [User].[usp_AddUserRole] TO sp_executor
GO
ALTER PROCEDURE [User].[usp_AddUserRole]
@UserID numeric(18,0),
@RoleID numeric(18,0) AS
SET XACT_ABORT, NOCOUNT ON
BEGIN TRY
BEGIN TRANSACTION
INSERT INTO [User].[User_Role] (
[UserID]
,[RoleID]
)
VALUES (
@UserID
,@RoleID
)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@trancount > 0 ROLLBACK TRANSACTION
;THROW
RETURN -1
END CATCH
GO
, но мне кажется, что это не удобно для пользователя.Я мог бы также сделать это напрямую с помощью значений Login и Role и разрешить идентификаторы внутри хранимой процедуры:
ALTER PROCEDURE [User].[usp_AddUserRole]
@Login varchar(30),
@Role varchar(50) AS
SET XACT_ABORT, NOCOUNT ON
BEGIN TRY
BEGIN TRANSACTION
DECLARE @UserID numeric = (SELECT UserID FROM [User].[User] WHERE [Login] = @Login)
DECLARE @RoleID numeric = (SELECT RoleID FROM [User].[Role] WHERE [Name] = @Role)
INSERT INTO [User].[User_Role] (
[UserID]
,[RoleID]
)
VALUES (
@UserID
,@RoleID
)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@trancount > 0 ROLLBACK TRANSACTION
;THROW
RETURN -1
END CATCH
GO
Эти хранимые процедуры будут вызываться из некоторых веб-сервисов в будущем.Знаете ли вы, какой подход следует использовать и почему?
Спасибо!