powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
31 сообщений из 31, показаны все 2 страниц
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39907361
guestfreeman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток. Имеется SQL Server 2017 Express. В БД model "Автоматически закрывать" установлено в False, но при создании новой БД этот параметр везде установлен в True. Приходится руками везде переделывать. Просьба подсказать почему SQL так себя ведет, и можно ли настроить чтобы этот параметр по умолчанию был в False.
БД создаются не из SQL'я, а в оснастке Администрирования серверов 1С, т.е. выставлять этот параметр при создании базы не подойдет, т.к. этим управляет 1С.
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39907383
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guestfreeman, базы создаются из базы model - проверьте в ней настройку.
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39907414
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Minamoto
guestfreeman, базы создаются из базы model - проверьте в ней настройку.
Или "оснастка 1С" явно устанавливает эту опцию...
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39907423
На экспресс всегда эта опция включается даже если в мастере отключить. Сделано из-за политических причин - экономить память если баз насоздают много.
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39907475
guestfreeman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В model опция как раз и поставлена в False. Т.е. в Express никак не сделать чтобы автоматом False было ?
Причина не в 1С, т.к. ради эксперимента ставил SQL 2017 Std, из одной и той же оснастки 1С создавал БД. В STD опция - False, в Express - True.
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39907520
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guestfreeman
Т.е. в Express никак не сделать чтобы автоматом False было ?

Пишут, что никак:

https://blogs.msdn.microsoft.com/sqlexpress/2008/02/22/understanding-sql-express-behavior-idle-time-resource-usage-auto_close-and-user-instances/ The behavior of CREATE DATABASE in SQL Express is not configurable, it will always set AUTO_CLOSE to True,
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39907522
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Minamoto
guestfreeman
Т.е. в Express никак не сделать чтобы автоматом False было ?

Пишут, что никак:

https://blogs.msdn.microsoft.com/sqlexpress/2008/02/22/understanding-sql-express-behavior-idle-time-resource-usage-auto_close-and-user-instances/ The behavior of CREATE DATABASE in SQL Express is not configurable, it will always set AUTO_CLOSE to True,

Вот тут: https://dba.stackexchange.com/questions/57270/autoclose-property-resets-to-true-after-attaching-db-even-if-model-is-set-to-fal
рекомендуют, как один из вариантов, настроить джоб, который будет искать базы c включенной опцией, и отключать её.
Да, поскольку джобов в Express тоже нет, то придется его настраивать через Windows Sheduler, или в той же 1С, кажется, есть периодические задания, ЕМНИП.
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39907708
guestfreeman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, прочел, спасибо. Может у кого "завалялся" код для sqlcmd, который будет проверять свойство "Autoclose" и ставить его в True ?
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39907715
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Minamoto
рекомендуют, как один из вариантов, настроить джоб, который будет искать базы c включенной опцией, и отключать её.
Да, поскольку джобов в Express тоже нет, то придется его настраивать через Windows Sheduler, или в той же 1С, кажется, есть периодические задания, ЕМНИП.
Хм, а не лучше отключать триггером?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TRIGGER change_autoclose_option
ON ALL SERVER
FOR CREATE_DATABASE	
AS 
	declare @database sysname
	select @database = EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]','sysname')  
	if exists (select * from sys.databases where name = @database and is_auto_close_on = 1)
		exec('alter database ['+@database+'] set AUTO_CLOSE OFF')
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39907724
Фотография PsyMisha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guestfreeman,

Ловите -

1) Скрипт ниже


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DECLARE @DatabaseName varchar(8000), @SQLCMD varchar(8000);

DECLARE Database_Cursor CURSOR READ_ONLY FOR
SELECT d.[name]
FROM [master].sys.databases as d
WHERE d.is_auto_close_on = 1

OPEN Database_Cursor;
FETCH NEXT FROM Database_Cursor into @DatabaseName;

WHILE @@FETCH_STATUS = 0
	BEGIN
		SET @SQLCMD= 'ALTER DATABASE [' + @DatabaseName + '] SET AUTO_CLOSE OFF WITH NO_WAIT'

		--PRINT @SQLCMD;
		EXEC (@SQLCMD);
	FETCH NEXT FROM Database_Cursor into @DatabaseName;
	END;
CLOSE Database_Cursor;
DEALLOCATE Database_Cursor;




2) Сохраняете его, к примеру по следующему пути: c:\temp\ExecScript.sql
3) Делаете и сохраняете батник со следующим содержимым: sqlcmd -S localhost -E -i c:\temp\ExecScript.sql
4) Делаете периодический виндовый джоб, в нем запуск батника, созданного на шаге 3)
5) Profit

P.S. - sqlcmd будет имперсонировать контекст безопасности учетной записи, вызывающей скрипт.
Можно сделать специальный системный аккаунт для запуска джоба в Windows, создать его на сиквеле, и назначить права - грубо - sysadmin, но можно еще покопать, возможно и уровнем чуть пониже можно обойтись
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39907744
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Хм, а не лучше отключать триггером?
alter database нельзя выполнить в транзакции.
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908005
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
alexeyvg
Хм, а не лучше отключать триггером?
alter database нельзя выполнить в транзакции.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
ALTER TRIGGER change_autoclose_option
ON ALL SERVER
FOR CREATE_DATABASE, ALTER_DATABASE	
AS 
	declare @database sysname
	select @database = EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]','sysname')  
	if exists (select * from sys.databases where name = @database and is_auto_close_on = 1)
		exec('commit tran; alter database ['+@database+'] set AUTO_CLOSE OFF; begin tran')

:-)
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908012
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

А commit пробовали выполнять в триггере?
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908014
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
alexeyvg,

А commit пробовали выполнять в триггере?
Да, этот код я тщательно проверил. Всё автопереключается, как положено.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE DATABASE test_autoclose
go
DROP TRIGGER IF EXISTS change_autoclose_option ON ALL SERVER
go
CREATE TRIGGER change_autoclose_option
ON ALL SERVER
FOR CREATE_DATABASE, ALTER_DATABASE	
AS 
	declare @database sysname
	select @database = EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]','sysname')  
	if exists (select * from sys.databases where name = @database and is_auto_close_on = 1)
		exec('commit tran; alter database ['+@database+'] set AUTO_CLOSE OFF; begin tran')
go

select is_auto_close_on from sys.databases where name = 'test_autoclose'
alter database test_autoclose set AUTO_CLOSE ON
select is_auto_close_on from sys.databases where name = 'test_autoclose'
go
DROP DATABASE test_autoclose
go
DROP TRIGGER IF EXISTS change_autoclose_option ON ALL SERVER
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908016
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
invm
alexeyvg,

А commit пробовали выполнять в триггере?
Да, этот код я тщательно проверил.
Я, кстати, тоже думал, что не прокатит. Но прокатило :-)
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908021
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

Да, сперва не увидел трюк с begin tran;
Из-за этого begin tran и работает.
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908036
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
alexeyvg,

Да, сперва не увидел трюк с begin tran;
Из-за этого begin tran и работает.
Мало тогго, это не сработает, если commit...begin
написать вне exec:
Код: sql
1.
2.
3.
	commit tran;
	exec('alter database ['+@database+'] set AUTO_CLOSE OFF;')
	begin tran;

Будет ошибка
Msg 226, Level 16, State 6, Line 17
ALTER DATABASE statement not allowed within multi-statement transaction.
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908039
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

Это ошибка компиляции
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908041
Фотография PsyMisha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg, invm

Здорово, современный способ - не знал, - спасибо коллеги!
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908045
Фотография PsyMisha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg, invm
А можно вопрос - трюк, конечно, шикарный, но зачем ALTER DATABASE в явной транзакции делать?
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908067
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PsyMisha,

Наоборот - не делать в транзакции.
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908086
Фотография PsyMisha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Тогда просьба прокомментировать, пожалуйста эту строчку. Немного исказилось понимание того, чего хотите добиться в итоге

Код: sql
1.
exec('commit tran; alter database ['+@database+'] set AUTO_CLOSE OFF; begin tran')
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908089
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
alexeyvg,

Это ошибка компиляции
Ага, он проверяет состояние в транзакции во время компиляции, хотя, казалось бы, зачем? Ведь получилось, что неправильно проверяет? Ведь в ведь такую же ошибку он должен выдать и в процедуре).
В общем, бага парсера.
PsyMisha
alexeyvg, invm
А можно вопрос - трюк, конечно, шикарный, но зачем ALTER DATABASE в явной транзакции делать?
Наоборот, нельзя в транзакции, а в триггере в момент его выполнения всегда открыта транзакция.
И вот, нужно сделать, что бы её не было.
Кривой парсер не позволяет это сделать явным образом, то есть закрыть, сделать ALTER, и открыть заново, но вот в EXEC можно.
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908090
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PsyMisha
invm,

Тогда просьба прокомментировать, пожалуйста эту строчку. Немного исказилось понимание того, чего хотите добиться в итоге

Код: sql
1.
exec('commit tran; alter database ['+@database+'] set AUTO_CLOSE OFF; begin tran')

Просто вы, наверное, не знали, что в триггере всегда открыта транзакция.
Если это знать, то, думаю, всё становится понятно.
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908093
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Мало тогго, это не сработает, если commit...begin
написать вне exec:
Код: sql
1.
2.
3.
	commit tran;
	exec('alter database ['+@database+'] set AUTO_CLOSE OFF;')
	begin tran;


Будет ошибка
Msg 226, Level 16, State 6, Line 17
ALTER DATABASE statement not allowed within multi-statement transaction.

invm
alexeyvg,

Это ошибка компиляции
А, извиняюсь, это моя ошибка, а не компиляции :-)
Я же не поставил begin ... end

Вот так работает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TRIGGER change_autoclose_option
ON ALL SERVER
FOR CREATE_DATABASE, ALTER_DATABASE	
AS 
	declare @database sysname
	select @database = EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]','sysname')  
	if exists (select * from sys.databases where name = @database and is_auto_close_on = 1)
	begin
--		exec('commit tran; alter database ['+@database+'] set AUTO_CLOSE OFF; begin tran')\
		commit tran;
		exec('alter database ['+@database+'] set AUTO_CLOSE OFF;')
		begin tran;
	end
go



Вот если написать без EXEC (понятно, чисто гипотетически, ведь имя базы неизвестно), тьогда будет ошибка
Msg 287, Level 16, State 2, Procedure change_autoclose_option, Line 11 [Batch Start Line 4]
The ALTER DATABASE statement is not allowed within a trigger.
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908097
Фотография PsyMisha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg

Просто вы, наверное, не знали, что в триггере всегда открыта транзакция.


Огонь, спасибо, действительно не знал :)

P.S. - можно и на ты, если что)
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908120
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PsyMisha
Немного исказилось понимание того, чего хотите добиться в итоге
Решаются две проблемы
1. alter database нельзя выполнять в транзакции.
2. Нельзя завершать транзакцию в триггере.
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908265
guestfreeman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток, спасибо за ответы. Не читал тему пару дней. Хочу уточнить правильно ли я понял.
1. Я создаю этот триггер в нужном мне экземпляре SQL Server через новый запрос:

CREATE TRIGGER change_autoclose_option
ON ALL SERVER
FOR CREATE_DATABASE, ALTER_DATABASE
AS
declare @database sysname
select @database = EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]','sysname')
if exists (select * from sys.databases where name = @database and is_auto_close_on = 1)
begin
-- exec('commit tran; alter database ['+@database+'] set AUTO_CLOSE OFF; begin tran')\
commit tran;
exec('alter database ['+@database+'] set AUTO_CLOSE OFF;')
begin tran;
end
go

2. После этого, любая создаваемая БД будет иметь параметр AutoClode - Off ?
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908410
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно через event notification прикрутить.
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908430
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guestfreeman
Всем доброго времени суток, спасибо за ответы. Не читал тему пару дней. Хочу уточнить правильно ли я понял.
1. Я создаю этот триггер в нужном мне экземпляре SQL Server через новый запрос:
2. После этого, любая создаваемая БД будет иметь параметр AutoClode - Off ?
Да.
...
Рейтинг: 0 / 0
SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
    #39908474
guestfreeman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем за уделенное время.
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL Server 2017 Express - у новых баз выставляется "Автоматически закрывать" - True а не F
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]