Параметры хранимой процедуры SQL - подход - PullRequest
0 голосов
/ 20 ноября 2018

Я занимаюсь разработкой относительно простой базы данных, которая будет управлять пользователями, оборудованием и программным обеспечением на заводе.

Я не специалист по темам баз данных.Ниже приведен фрагмент базы данных:

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

Эти хранимые процедуры будут вызываться из некоторых веб-сервисов в будущем.Знаете ли вы, какой подход следует использовать и почему?

Спасибо!

1 Ответ

0 голосов
/ 20 ноября 2018

Оба подхода приемлемы.Еще лучше иметь две рефакторированные хранимые процедуры: usp_AddUserRoleByNames, которые читают идентификаторы, а затем вызывают usp_AddUserRoleByIDs.

При разрешении идентификаторов по именам в хранимой процедуре:

  • изоляция транзакции должнаустановите значение REPEATABLE READ хотя бы для предотвращения изменения / удаления прочитанных данных
  • проверьте значения NULL идентификаторов
  • убедитесь, что ссылка на роль пользователя еще не существует (требуется уровень SERIALISABLE)
  • не смешивать возврат кодов ошибок и выдачу исключений
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...