2016-05-25 8 views
1

私はUserRoleを返すプロシージャ"GetCurrentUserRoleByDomainLogin"を持っています。 そして、別の手順(GroupInsertUpdateDelete)の条件でこの手順を実行したいのですが、構文エラーです。別のプロシージャから1つのプロシージャをコールし、MS SQLを返す値を使用します

これは "GetCurrentUserRoleByDomainLogin" です:

CREATE PROCEDURE [dbo].[GetCurrentUserRoleByDomainLogin] 
AS 

SELECT UserRole FROM [User] 
JOIN Role on [User].UserRole=Role.RoleId 
WHERE [User].DomainLogin = (SELECT SYSTEM_USER) 

これは "GroupInsertUpdateDelete:" です。この文字列は私に構文エラーになります

CREATE PROCEDURE [dbo].[GroupInsertUpdateDelete] 
    @GroupName nvarchar(50), 
    @GroupRole nvarchar(50), 
    @StatementType nvarchar(50),  
    @UserRole nvarchar(50) = CALL GetCurrentUserRoleByDomainLogin 

    AS 

IF EXISTS (SELECT * FROM Groups WHERE [email protected]) 
    PRINT 'Group with such GroupName already exists' 

ELSE 
IF @StatementType = 'Insert' AND @UserRole = 'Admin' 
BEGIN 
    insert into [Group] 
     (GroupName,RoleName) 
    values (@GroupName, @GroupRole) 
    PRINT 'Group was added successfully' 
    END 

IF @StatementType = 'Update' AND @UserRole = 'Admin' 
BEGIN 
    UPDATE [Group] 
    SET GroupName = @GroupName, 
     GroupRole = @GroupRole  
     WHERE GroupName = @GroupName 
     PRINT 'Group was updated successfully' 
     END 

IF @StatementType = 'Delete' AND @UserRole = 'Admin' 
BEGIN 
    DELETE FROM [Group] WHERE GroupName = @GroupName 
    PRINT 'Group was deleted successfully' 
    END 

IF @StatementType = 'Select' 
BEGIN 
    SELECT * from [Group] 
    END 

@UserRole nvarchar(50) = CALL GetCurrentUserRoleByDomainLogin 

だから、 "GroupInsertUpdateDelete"プロシージャの "GetCurrentUserRoleByDomainLogin"プロシージャをコールし、変数に返す値を入れて、 "if文"の最後の値をチェックしたいといいです。どうしたらいいですか?

答えて

0

あなたはOUTPUTパラメータを追加するためにあなたのSPを編集する必要があります。

CREATE PROCEDURE [dbo].[GetCurrentUserRoleByDomainLogin] 
    @UserRole nvarchar(50) OUTPUT 
AS 

SELECT TOP 1 @UserRole = UserRole 
FROM [User] u 
INNER JOIN [Role] r 
    ON u.UserRole = r.RoleId 
WHERE u.DomainLogin = (SELECT SYSTEM_USER) 

RETURN; 

そして、それが好き呼び出す:

DECLARE @UserRole nvarchar(50) 

EXEC GetCurrentUserRoleByDomainLogin @UserRole OUTPUT 

をあなたのSPで@UserRoleを使用することができた後。

0

CALLはSQL Serverのコマンドではありません。代わりにEXECUTEまたはEXECがあります。そして私はあなたがパラメータのデフォルト値としてそれを行うことはできないと思います。代わりに、コードの最初の行で行います。

0

あなたは上記を使用するには、このページに Return Data from a Stored Procedure

USE AdventureWorks2012; 
GO 
    IF OBJECT_ID('Sales.uspGetEmployeeSalesYTD', 'P') IS NOT NULL 
     DROP PROCEDURE Sales.uspGetEmployeeSalesYTD; 
GO 
CREATE PROCEDURE Sales.uspGetEmployeeSalesYTD 
@SalesPerson nvarchar(50), 
@SalesYTD money OUTPUT 
AS 

    SET NOCOUNT ON; 
    SELECT @SalesYTD = SalesYTD FROM Sales.SalesPerson AS sp JOIN HumanResources.vEmployee AS e ON e.BusinessEntityID = sp.BusinessEntityID WHERE LastName = @SalesPerson; 
RETURN 
GO 
0
CREATE PROCEDURE [dbo].[GetCurrentUserRoleByDomainLogin] 
    @UserRole NVARCHAR(50) OUTPUT 
AS 

SELECT UserRole FROM [User] 
JOIN Role on [User].UserRole=Role.RoleId 
WHERE [User].DomainLogin = SYSTEM_USER 
GO 

を例のようにOUTPUTパラメータを設定する必要がありますが次の手順を実行します -

DECLARE @MyUserRole NVARCHAR(50) 
EXEC [dbo].[GetCurrentUserRoleByDomainLogin] @MyUserRole OUTPUT 

私の好み正直に言うでしょう2番目のストアドプロシージャをリファクタリングすることです。そうすれば、その役割を引き受けることを余儀なくされる議論はありません。

CREATE PROCEDURE [dbo].[GroupInsertUpdateDelete] 
    @GroupName nvarchar(50), 
    @GroupRole nvarchar(50), 
    @StatementType nvarchar(50) 

    AS 

IF EXISTS (SELECT * FROM Groups WHERE [email protected]) 
    PRINT 'Group with such GroupName already exists' 

ELSE 

    BEGIN 
     IF @StatementType = 'Select' 
      BEGIN 
       SELECT * from [Group] 
      END  
     ELSE 
      BEGIN 
       DECLARE @UserRole nvarchar(50) 
       SELECT UserRole 
       FROM [User] 
        INNER JOIN Role on [User].UserRole=Role.RoleId 
       WHERE [User].DomainLogin = SYSTEM_USER 


      IF @UserRole='Admin' 
       BEGIN 
        IF @StatementType = 'Update' 
         BEGIN 
          UPDATE [Group] 
          SET GroupName = @GroupName, 
           GroupRole = @GroupRole  
           WHERE GroupName = @GroupName 
           PRINT 'Group was updated successfully' 
         END 
        IF @StatementType = 'Insert' 
         BEGIN 
          insert into [Group] 
           (GroupName,RoleName) 
          values (@GroupName, @GroupRole) 
          PRINT 'Group was added successfully' 
         END 
        IF @StatementType = 'Delete' AND @UserRole = 'Admin' 
         BEGIN 
          DELETE FROM [Group] WHERE GroupName = @GroupName 
          PRINT 'Group was deleted successfully' 
         END 
       END 
    END 
GO 

私はそれがあなたのアプリケーションのセキュリティとは何かを持っている、特にとして、これを行うには、単一のPROCを持つに対して助言するだろうと言っています。

このprocを実行するアクセス権を持つ人は、あなたのグループで好きなCRUDを実行できます。私は強くここで任務の分離をお勧めします。 グループ情報を読むことができる人は、それを修正したい人ではないかもしれません。 機械的に行うことはできますが、それは良い考えですか?

関連する問題