Доброго времени суток!
Столкнулся с такой ситуацией. Для справочного поля в sql-запросе select через left join я выходил на "Название" значения (вместо айди, которое по умолчанию). Но, как выяснилось с помощью "Sys{объект}Lcz", отображались в запросе значения из другой локализации справочника, не "ru-RU". И на данный момент установлено у меня 2 локализации: RU и EN.
Вопрос. Можно ли как-то избавится от иной локализации вовсе, оставив русскую соответственно? Ну или убрать для уже существующих в системе объектов иную локализацию?
П.с. Мои коллеги подсказали, что, убрав локализацию, это повысило бы чутка быстродействие системы.
Нравится
Здравствуйте.
Их можно выключить, отключив признак "активный". Это, а также список всех языков в системе можно увидеть в Languages разделе в дизайнере системы.
Я бы не рекомендовал удалять английскую культуру, это может за собой повлечь проблемы в работе системы, которые сразу сложно предугадать. К тому же, в приложении почти всё завязывается на анг. культуру. Если бы речь шла об удалении Испанского или Иврита, то последствий было бы меньше или вовсе никаких.
Скрипты есть, но выполнять их стоит на свой страх и риск. Скрипт удаляет все языки, которые не используются в профиле пользователей и который не является основным.
Если всё же вы решитесь удалять анг. культуру, сделайте копию приложения и удалите её там. После чего проверьте работу приложения в разделах, компиляцию, генерацию кода, установку пакетов - по максимуму провести тестирование.
IF OBJECT_ID('tempdb..#UsedCultures') IS NOT NULL
DROP Table #UsedCultures
-- Получение списка используемых культур
SELECT DISTINCT cult.Id
INTO #UsedCultures
FROM SysCulture cult
INNER JOIN SysAdminUnit au
ON au.SysCultureId = cult.Id
INSERT INTO #UsedCultures
(Id)
SELECT
SysSettingsValue.GuidValue
FROM
SysSettingsValue
INNER JOIN SysSettings
ON SysSettings.Id = SysSettingsValue.SysSettingsId
WHERE
SysSettings.Code = 'PrimaryCulture'
-- Получение списка таблиц, из которых нужно удалять данные
DECLARE TableNamesCursor CURSOR FOR
SELECT
t3.TABLE_NAME AS ChildTableName
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS t1
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS t2 ON t1.UNIQUE_CONSTRAINT_NAME = t2.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS t3 ON t1.CONSTRAINT_NAME = t3.CONSTRAINT_NAME
WHERE
t2.TABLE_NAME = 'SysCulture'
and t2.COLUMN_NAME = 'Id'
and t3.COLUMN_NAME = 'SysCultureId'
DECLARE @TableName SYSNAME
OPEN TableNamesCursor
FETCH NEXT FROM TableNamesCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @TableName
DECLARE @Sql NVARCHAR(MAX);
SET @Sql = 'DELETE FROM ' + @TableName + '
WHERE SysCultureId NOT IN (SELECT Id FROM #UsedCultures)';
PRINT @Sql
EXECUTE sp_executesql @Sql
FETCH NEXT FROM TableNamesCursor INTO @TableName
END
CLOSE TableNamesCursor
DEALLOCATE TableNamesCursor
DELETE FROM SysCulture
WHERE Id NOT IN (SELECT Id FROM #UsedCultures)
IF OBJECT_ID('tempdb..#UsedCultures') IS NOT NULL
DROP Table #UsedCultures
K.Ivan,
здравствуйте!
Нет, удалять англ. культуру не собираемся.
Проблема в том, что меняются данные в таблице локализации, а не в таблице справочника.
Не подскажете, как обеспечить сохранение данных в справочнике, а не в таблице локализации? Или как привязать таблицу локализации объекта к пакету?
И после Вашего ответа я поставил на русской культуре признак "по умолчанию", с англ. признак убрался, но признак "активный" на англ. культуре не даёт снять (серый чекбокс).
Английскую культуру деактивировать полностью невозможно, серый чекбокс - это нормальное поведение.
Опишите, пожалуйста, детальнее касательно проблемы с изменением данные в таблице локализации, не до конца понятна суть вопроса.
Доброго дня коллеги, а есть такой скрипт для PostgreSQL?
Носуля Роман Викторович,
Роман, добрый день!
BEGIN;
-- Получение списка используемых культур
CREATE TEMP TABLE "UsedCultures" ON COMMIT DROP AS
SELECT DISTINCT cult."Id"
FROM "SysCulture" cult
INNER JOIN "SysAdminUnit" au
ON au."SysCultureId" = cult."Id";
INSERT INTO "UsedCultures" ("Id")
SELECT "SysSettingsValue"."GuidValue"
FROM "SysSettingsValue"
INNER JOIN "SysSettings"
ON "SysSettings"."Id" = "SysSettingsValue"."SysSettingsId"
WHERE "SysSettings"."Code" = 'PrimaryCulture';
-- Получение списка таблиц, из которых нужно удалять данные
DO $$
DECLARE
TableNamesCursor REFCURSOR;
TableName varchar;
BEGIN
OPEN TableNamesCursor FOR
SELECT kcu.TABLE_NAME
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu
INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
ON ccu.CONSTRAINT_CATALOG = rc.UNIQUE_CONSTRAINT_CATALOG
AND ccu.CONSTRAINT_SCHEMA = rc.UNIQUE_CONSTRAINT_SCHEMA
AND ccu.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
ON kcu.CONSTRAINT_CATALOG = rc.CONSTRAINT_CATALOG
AND kcu.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA
AND kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
WHERE ccu.COLUMN_NAME = 'Id'
AND ccu.TABLE_SCHEMA = 'public'
AND ccu.TABLE_NAME = 'SysCulture';
--Удаление локализаций
LOOP
FETCH TableNamesCursor INTO TableName;
EXIT WHEN TableName IS NULL;
RAISE NOTICE 'Deleting from table %', TableName;
EXECUTE format('DELETE FROM %I WHERE "SysCultureId" NOT IN (SELECT "Id" FROM
"UsedCultures")', TableName);
END LOOP;
CLOSE TableNamesCursor;
END $$;
DELETE FROM "SysCulture"
WHERE "Id" NOT IN (SELECT "Id" FROM "UsedCultures");
COMMIT