Advertisement
Guest User

Untitled

a guest
Jul 21st, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.22 KB | None | 0 0
  1. USE [Rostelecom]
  2. GO
  3.  
  4. /****** Object: UserDefinedTableType [dbo].[UserRole] Script Date: 21.07.2017 17:30:18 ******/
  5. CREATE TYPE [dbo].[UserRole] AS TABLE(
  6. [UserID] [int] NOT NULL,
  7. [UserRole] [int] NOT NULL
  8. )
  9. GO
  10.  
  11.  
  12. CREATE TABLE [dbo].[UserDependency](
  13. [UserDependencyID] [int] IDENTITY(1,1) NOT NULL,
  14. [UserID] [int] NULL,
  15. [ParentID] [int] NULL,
  16. CONSTRAINT [PK_UserDependency_UserDependencyID] PRIMARY KEY CLUSTERED
  17. (
  18. [UserDependencyID] ASC
  19. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  20. ) ON [PRIMARY]
  21.  
  22. GO
  23.  
  24. ALTER TABLE [dbo].[UserDependency] WITH CHECK ADD CONSTRAINT [FK_UserDependency_User_ParentID] FOREIGN KEY([ParentID])
  25. REFERENCES [dbo].[User] ([UserID])
  26. GO
  27.  
  28. ALTER TABLE [dbo].[UserDependency] CHECK CONSTRAINT [FK_UserDependency_User_ParentID]
  29. GO
  30.  
  31. ALTER TABLE [dbo].[UserDependency] WITH CHECK ADD CONSTRAINT [FK_UserDependency_User_UserID] FOREIGN KEY([UserID])
  32. REFERENCES [dbo].[User] ([UserID])
  33. GO
  34.  
  35. ALTER TABLE [dbo].[UserDependency] CHECK CONSTRAINT [FK_UserDependency_User_UserID]
  36. GO
  37.  
  38. ALTER TABLE [dbo].[UserDependency] WITH CHECK ADD CONSTRAINT [chkRoleRules] CHECK (([dbo].[CheckRoleRules]([userId],[parentId])=(0)))
  39. GO
  40.  
  41. ALTER TABLE [dbo].[UserDependency] CHECK CONSTRAINT [chkRoleRules]
  42. GO
  43.  
  44.  
  45.  
  46.  
  47. CREATE PROCEDURE [dbo].[SaveUserData]
  48. @userId INT,
  49. @fullname NVARCHAR(512),
  50. @phone NVARCHAR(128),
  51. @phoneWork NVARCHAR(128),
  52. @email NVARCHAR(256),
  53. @post NVARCHAR(512),
  54. @subStr NVARCHAR(512),
  55. @isSync BIT,
  56. @roleId INT,
  57. @sub INT,
  58. @childs UserRole READONLY,
  59. @parents UserRole READONLY
  60. AS
  61. BEGIN
  62. SET NOCOUNT ON;
  63. BEGIN TRY
  64. BEGIN TRANSACTION
  65. --Обновляем поля пользователя
  66. UPDATE dbo.[User]
  67. SET
  68. fullname=@fullname,
  69. Phone=@phone,
  70. PhoneWork=@phoneWork,
  71. Email=@email,
  72. RoleID=@roleId,
  73. SubdivisionID=@sub,
  74. Post=@post,
  75. SubdivisionStr=@subStr,
  76. IsSync=@isSync
  77. WHERE UserID=@userId
  78.  
  79. --Сохраняем роли для пользователей, которые их не имели (автоматическое сохранение роли)
  80. MERGE dbo.[User] AS _target
  81. USING ( SELECT * FROM @childs
  82. UNION ALL SELECT * FROM @parents
  83. ) AS _source
  84. ON _source.UserID = [_target].UserID
  85. AND [_target].RoleID IS NULL
  86. WHEN MATCHED THEN
  87. UPDATE SET [_target].RoleID=[_source].UserRole;
  88.  
  89.  
  90. --Обновляем зависимости подчиненных
  91. WITH udChild AS (SELECT * FROM dbo.UserDependency WHERE ParentID=@userId)
  92. MERGE udChild AS _target
  93. USING ( SELECT *
  94. FROM @childs
  95. ) AS _source
  96. ON _source.UserID = [_target].UserID
  97. WHEN NOT MATCHED BY TARGET THEN
  98. INSERT (UserID , ParentID )
  99. VALUES ( _source.UserID, @userId )
  100. WHEN NOT MATCHED BY SOURCE THEN DELETE;
  101.  
  102. --Обновляем зависимости руководителей
  103. WITH udParent AS (SELECT * FROM dbo.UserDependency WHERE UserID=@userId)
  104. MERGE udParent AS _target
  105. USING ( SELECT *
  106. FROM @parents
  107. ) AS _source
  108. ON _source.UserID = [_target].ParentID
  109. AND @userId = [_target].UserID
  110. WHEN NOT MATCHED BY TARGET THEN
  111. INSERT (UserID , ParentID )
  112. VALUES ( @userId, _source.UserId )
  113. WHEN NOT MATCHED BY SOURCE THEN DELETE;
  114.  
  115. COMMIT
  116. RETURN 1;
  117. END TRY
  118. BEGIN CATCH
  119.  
  120. IF @@TRANCOUNT > 0
  121. ROLLBACK
  122. RETURN -1;
  123. END CATCH
  124. END
  125.  
  126. GO
  127.  
  128.  
  129. CREATE FUNCTION [dbo].[CheckRoleRules] (@userId int, @parentId int)
  130. RETURNS int
  131. AS
  132. BEGIN
  133. DECLARE @retval INT = 0
  134. IF @parentId IS NULL RETURN 0;
  135. ELSE
  136. BEGIN
  137. DECLARE @userRole INT = (SELECT TOP 1 RoleID FROM dbo.[User] u WHERE u.UserID=@userId);
  138. DECLARE @parentRole INT = (SELECT TOP 1 RoleID FROM dbo.[User] u WHERE u.UserID=@parentId);
  139. --проверяем на соответствие иерархии ролей
  140. IF NOT EXISTS(SELECT 1 FROM dbo.RoleRule rr WHERE rr.RoleID = @userRole AND rr.ParentRoleID=@parentRole) RETURN 1;
  141. --проверяем отсутсвие некорректных привязок (пример: у Менеджера два Руководителя)
  142. IF((SELECT TOP 1 IsSingleParent FROM dbo.RoleRule rr WHERE rr.RoleID = @userRole)=1 AND (SELECT COUNT(*) FROM dbo.UserDependency WHERE UserID=@userId AND ParentID!=@parentId)>1) RETURN 1;
  143. --Если вставляем вставляем аналитика, как подчиненного Координатора 1-го уровня,
  144. --то не должно быть подчиненных у самого аналитика
  145. IF @userRole=5 AND @parentRole=3 AND EXISTS(SELECT 1 FROM dbo.UserDependency ud WHERE ud.ParentID=@userId) RETURN 1;
  146. --Проверяем что при вставке аналитика он не является одновременно подчиненным Координатора 1-го и Координатра 2-го уровня
  147. IF @userRole=5 AND EXISTS (SELECT 1
  148. FROM dbo.UserDependency ud
  149. INNER JOIN dbo.[User] u ON u.UserID=ud.ParentID
  150. WHERE ud.UserID=@userId
  151. GROUP BY u.RoleID
  152. HAVING COUNT(DISTINCT u.RoleID)>1) RETURN 1;
  153. END
  154. RETURN @retval
  155. END;
  156.  
  157. GO
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement