has anyone tried and tested migration from TS 3.3.1 to TS 3.4.0 in the way, when only binary files are replaced from 3.3.1 to 3.4.0 and tbl_DatabaseInfo is updated? The same way, which is discribed for 3.3.2. -> 3.4.0 at https://community.terrasoft.ua/blogs/6982.
Yes, You have to have 3.4 licenses and load them, when running 3.4 binaries with 3.3.2 database. We tried it in one project - it works.
Customer, who has 3.3.1, will buy 3.4 licenses, only the question is if 3.4 binaries can work with 3.3.1 database. Before buying, we have to try and test. Maybe someone already did it? :)
Hello Aurimas,
Personally I didn't solve this task, but one of our client had an experience. He had an issue with integrating with Outlook, and the problem was that macroses didn't work correctly. As I remember the solution was to update services which reply to Outlook integration from 3.4.0 version.
About other his problems after updating tbl_DatabaseInfo I don't know
I think you should update service 'tbl_DatabaseInfo' or just load this service from 3.4.0 original database into your database tbl_databaseinfo.rar
Don't forget to make a reserve copy of your current 'tbl_DatabaseInfo' service
Hello Aurimas, there is the difference in stored procedure tsp_GetLoginInfo which cause an error you faced, you shoud update it from 3.4.0 this would add missing column @DatabaseBuildVersion in it's body and Terrasoft will run after you add products JobManager and Dictionary in LicenseManager
And previous comment by Александр Кудряшов is also right
ALTER procedure [dbo].[tsp_GetLoginInfo](
@UserName sysname)
as
begin
/*
** Get Login Info.
*/if(@UserName ='')
begin
set @UserName = SYSTEM_USER
end
set nocount on
if((is_srvrolemember('sysadmin')<>1or is_member('db_owner')<>1)and(@UserName <> SYSTEM_USER))
begin
goto result
end
/*
** Declarations.
*/
declare @DatabaseID uniqueidentifier
declare @ParentDatabaseID uniqueidentifier
declare @DatabaseMajorVersion int
declare @DatabaseMinorVersion int
declare @DatabaseReleaseVersion int
declare @UseCache int
declare @ServiceModifiedOn datetime
declare @ServiceDeletedOn datetime
declare @ServerSessionsInfo nvarchar(2000)
declare @UserID uniqueidentifier
declare @ContactUserName nvarchar(250)
declare @AccountContactUserName nvarchar(250)
declare @UserContactID uniqueidentifier
declare @UserAccountID uniqueidentifier
declare @UserIsEnabled int
declare @UserPasswordNeverExpired int
declare @UserPasswordChangedOn datetime
declare @UserIsAdmin int
declare @UserIsSysAdmin int
declare @GroupPasswordChangePeriodType int
declare @CustomerID nvarchar(250)
declare @TimeZone nvarchar(250)
declare @DatabaseBuildVersion int
exec [dbo].[tsp_LoadUserAdminUnit] @AUserName = @UserName
select
@DatabaseID =[ID],
@ParentDatabaseID =[ParentID],
@DatabaseMajorVersion =[DatabaseMajorVersion],
@DatabaseMinorVersion =[DatabaseMinorVersion],
@DatabaseReleaseVersion =[DatabaseReleaseVersion],
@DatabaseBuildVersion =[DatabaseBuildVersion],
@UseCache =[UseCache],
@ServiceModifiedOn =[ServiceModifiedOn],
@ServiceDeletedOn =[ServiceDeletedOn],
@ServerSessionsInfo =[ServerSessionsInfo]
from [dbo].[tbl_DatabaseInfo]
select
@UserID =[u].[ID],
@UserContactID =[u].[UserContactID],
@UserIsEnabled =[u].[UserIsEnabled],
@UserPasswordNeverExpired =[u].[UserPasswordNeverExpired],
@UserPasswordChangedOn =[u].[UserPasswordChangedOn],
@ContactUserName =[c].[Name],
@UserAccountID =[c].[AccountID],
@AccountContactUserName =[a].[Name],
@TimeZone =[c].[TimeZone]
from [dbo].[tbl_AdminUnit][u]
left join [dbo].[tbl_Contact][c] on [c].[ID]=[u].[UserContactID]
left join [dbo].[tbl_Account][a] on [a].[ID]=[c].[AccountID]
where [u].[Name]= @UserName
and isnull([u].[IsGroup], 0)=0
set @UserIsSysAdmin = isnull(is_srvrolemember('sysadmin', @UserName), 0)if @UserIsSysAdmin =1
begin
set @UserIsAdmin =1
end else
begin
if exists(select * from sysmembers
where groupuid = user_id('db_owner')and memberuid = user_id(@UserName))
begin
set @UserIsAdmin =1
end else
begin
set @UserIsAdmin =0
end
end
if(isnull(@UserPasswordNeverExpired,0)<>1)
begin
SELECT
@GroupPasswordChangePeriodType = MAX([AdminUnit].[GroupPasswordChangePeriodType])
FROM [dbo].[tbl_AdminUnit] as [AdminUnit]
WHERE (isnull([AdminUnit].[IsGroup],0)=1)
AND ([AdminUnit].[ID] in (
SELECT DISTINCT [UserAdminUnit].[AdminUnitID]
FROM [dbo].[tbl_UserAdminUnit] as [UserAdminUnit]
WHERE ([UserAdminUnit].[UserName]= @UserName)))
end else
begin
set @GroupPasswordChangePeriodType =5
end
select
@CustomerID =[StringValue]
from [dbo].[tbl_SystemSetting]
where [Code]='CustomerID'
declare @version int
set @version = @@microsoftversion /0x01000000if(@version >8)
begin
if(object_id('[dbo].[tsp_fkeys]', 'P') is null)and(@UserIsSysAdmin =0)
begin
raiserror ('User with sysadmin right must to login first.', 17, 1)goto result
end
if(@UserIsSysAdmin =0)
begin
goto result
end
declare @sql nvarchar(4000)ifnot exists(select * from master.dbo.syslogins where name ='fkeys')
begin
set @sql ='create login [fkeys] with password = '''+ cast(newid() as varchar(38))+''', check_policy = off '
exec(@sql)if(not object_id('[dbo].[tsp_fkeys]', 'P') is null)
begin
exec('drop procedure [dbo].[tsp_fkeys]')
end
if exists(select * from sysusers where name ='fkeys')
begin
exec('drop user [fkeys]')
end
end
ifnot exists(select * from sysusers where name ='fkeys')
begin
exec('create user [fkeys] for login [fkeys]')
end
exec sp_addrolemember 'db_owner', 'fkeys'
declare @loginsid varbinary(85)
set @loginsid =(select sid from master.dbo.syslogins where
loginname ='fkeys'and isntname =0)if exists (select * from sysusers where name ='fkeys'and issqluser =1and sid <> @loginsid)
begin
exec sp_change_users_login 'update_one', 'fkeys', 'fkeys'
end
if object_id('[dbo].[tsp_fkeys]', 'P') is null
begin
set @sql =' create procedure [dbo].[tsp_fkeys]('+char(13)+' @pktable_name sysname = null, '+char(13)+' @pktable_owner sysname = null, '+char(13)+' @pktable_qualifier sysname = null, '+char(13)+' @fktable_name sysname = null, '+char(13)+' @fktable_owner sysname = null, '+char(13)+' @fktable_qualifier sysname = null ) '+char(13)+' with execute as ''fkeys'' '+char(13)+' as '+char(13)+' begin '+char(13)+' exec [sp_fkeys] @pktable_name, @pktable_owner, @pktable_qualifier, '+char(13)+' @fktable_name, @fktable_owner, @fktable_qualifier '+char(13)+' end'
exec (@sql)
grant execute on [dbo].[tsp_fkeys] to public
end
if object_id('[dbo].[tsp_GetIsObjectExists]', 'P') is null
begin
set @sql =' create procedure [dbo].[tsp_GetIsObjectExists] '+char(13)+' @ObjectName nvarchar(80), '+char(13)+' @SQLObjectName nvarchar(2) '+char(13)+' with execute as ''fkeys'' '+char(13)+' AS '+char(13)+' BEGIN '+char(13)+' select Count(*) '+char(13)+' from [sysobjects] '+char(13)+' where name = @ObjectName '+char(13)+' and type = @SQLObjectName '+char(13)+' END '
exec (@sql)
grant execute on [dbo].[tsp_GetIsObjectExists] to public
end
end
result:
select
getdate() AS [LoginDateTime],
@DatabaseID as [DatabaseID],
@ParentDatabaseID as [ParentDatabaseID],
@DatabaseMajorVersion as [DatabaseMajorVersion],
@DatabaseMinorVersion as [DatabaseMinorVersion],
@DatabaseReleaseVersion as [DatabaseReleaseVersion],
@DatabaseBuildVersion as [DatabaseBuildVersion],
@UseCache as [UseCache],
@ServiceModifiedOn as [ServiceModifiedOn],
@ServiceDeletedOn as [ServiceDeletedOn],
@ServerSessionsInfo as [ServerSessionsInfo],
@UserID as [UserID],
@UserName as [UserName],
@UserContactID as [UserContactID],
@ContactUserName as [ContactName],
@UserAccountID as [AccountID],
@AccountContactUserName as [AccountName],
@UserIsEnabled as [UserIsEnabled],
@UserPasswordNeverExpired AS [UserPasswordNeverExpired],
@GroupPasswordChangePeriodType as [GroupPasswordChangePeriodType],
@UserPasswordChangedOn as [UserPasswordChangedOn],
@UserIsAdmin as [UserIsAdmin],
@UserIsSysAdmin as [UserIsSysAdmin],
@CustomerID as [CustomerID],
@TimeZone as [TimeZone]
end
Aslo you will see the other problem after such migration. At first run you will see that Workspace will not initialize
And after switching the section workspace will appear correctly
The reason of this behavior is difference in Initialize functions in scr_Main
Solution
In scr_Main edit function amiAccountsOnExecute
Add
var CurrentWorkspaceWindow = wndWorkspace.Window;if(CurrentWorkspaceWindow){
StopOrRefreshWebDetail(CurrentWorkspaceWindow, false);}
insead of
var CurrentWorkspaceWindow = wndWorkspace.Window;if(!CurrentWorkspaceWindow){return;}
StopOrRefreshWebDetail(CurrentWorkspaceWindow, false);
In result you will get:
function amiAccountsOnExecute(ActionMenuItem){
var WorkspaceUSI = ActionMenuItem.Tag;
var DoRefreshWorkspace =(Main.WorkspaceUSI== WorkspaceUSI);if(!DoRefreshWorkspace){// var CurrentWorkspaceWindow = wndWorkspace.Window;// if (!CurrentWorkspaceWindow) {// return; // }
var CurrentWorkspaceWindow = wndWorkspace.Window;if(CurrentWorkspaceWindow){
StopOrRefreshWebDetail(CurrentWorkspaceWindow, false);}//StopOrRefreshWebDetail(CurrentWorkspaceWindow, false);}
ShowWorkspace(WorkspaceUSI);
....