среда, 15 февраля 2017 г.

Вывести все БД и их размер в SQL Server

/*
database_id  name   state_desc   recovery_model_desc total_size   data_size    data_used_size       log_size      log_used_size full_last_date      full_size    log_last_date log_size
8      Tfs_CRMMOSS   ONLINE FULL   9071.50      2110.31       1410.13      6961.19       15.72  2016-12-16 21:59:26.000  1388.53      NULL   NULL
7      Tfs_Configuration   ONLINE FULL   1360.00       584.00 516.25 776.00 428.83 NULL   NULL   NULL       NULL
10     Tfs_TestCollection  ONLINE FULL   656.00 136.00 128.50 520.00 378.02 NULL   NULL   NULL   NULL
9      Tfs_SharePointCollection   ONLINE FULL   358.31 194.63 188.75 163.69 150.85 2016-12-16 22:32:36.000 173.15 NULL   NULL
5      ReportServer  ONLINE FULL   80.00  8.00   6.69   72.00  14.59  NULL   NULL   NULL   NULL
4      msdb   ONLINE SIMPLE 46.75  17.94  16.88  28.81  2.25   NULL   NULL   NULL   NULL
2      tempdb ONLINE SIMPLE 24.00  16.00  48.13  8.00   4.49   NULL   NULL   NULL   NULL
3      model  ONLINE FULL   16.00  8.00   2.44   8.00   0.77   NULL   NULL   NULL   NULL
6      ReportServerTempDB  ONLINE SIMPLE 16.00  8.00   3.75   8.00   2.34   NULL   NULL   NULL   NULL
1      master ONLINE SIMPLE 6.00   4.00   3.69   2.00   0.98   NULL   NULL   NULL   NULL
*/

IF OBJECT_ID('tempdb.dbo.#space') IS NOT NULL
    DROP TABLE #space

CREATE TABLE #space (
      database_id INT PRIMARY KEY
    , data_used_size DECIMAL(18,2)
    , log_used_size DECIMAL(18,2)
)

DECLARE @SQL NVARCHAR(MAX)

SELECT @SQL = STUFF((
    SELECT '
    USE [' + d.name + ']
    INSERT INTO #space (database_id, data_used_size, log_used_size)
    SELECT
          DB_ID()
        , SUM(CASE WHEN [type] = 0 THEN space_used END)
        , SUM(CASE WHEN [type] = 1 THEN space_used END)
    FROM (
        SELECT s.[type], space_used = SUM(FILEPROPERTY(s.name, ''SpaceUsed'') * 8. / 1024)
        FROM sys.database_files s
        GROUP BY s.[type]
    ) t;'
    FROM sys.databases d
    WHERE d.[state] = 0
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '')

EXEC sys.sp_executesql @SQL

SELECT
      d.database_id
    , d.name
    , d.state_desc
    , d.recovery_model_desc
    , t.total_size
    , t.data_size
    , s.data_used_size
    , t.log_size
    , s.log_used_size
    , bu.full_last_date
    , bu.full_size
    , bu.log_last_date
    , bu.log_size
FROM (
    SELECT
          database_id
        , log_size = CAST(SUM(CASE WHEN [type] = 1 THEN size END) * 8. / 1024 AS DECIMAL(18,2))
        , data_size = CAST(SUM(CASE WHEN [type] = 0 THEN size END) * 8. / 1024 AS DECIMAL(18,2))
        , total_size = CAST(SUM(size) * 8. / 1024 AS DECIMAL(18,2))
    FROM sys.master_files
    GROUP BY database_id
) t
JOIN sys.databases d ON d.database_id = t.database_id
LEFT JOIN #space s ON d.database_id = s.database_id
LEFT JOIN (
    SELECT
          database_name
        , full_last_date = MAX(CASE WHEN [type] = 'D' THEN backup_finish_date END)
        , full_size = MAX(CASE WHEN [type] = 'D' THEN backup_size END)
        , log_last_date = MAX(CASE WHEN [type] = 'L' THEN backup_finish_date END)
        , log_size = MAX(CASE WHEN [type] = 'L' THEN backup_size END)
    FROM (
        SELECT
              s.database_name
            , s.[type]
            , s.backup_finish_date
            , backup_size =
                        CAST(CASE WHEN s.backup_size = s.compressed_backup_size
                                    THEN s.backup_size
                                    ELSE s.compressed_backup_size
                        END / 1048576.0 AS DECIMAL(18,2))
            , RowNum = ROW_NUMBER() OVER (PARTITION BY s.database_name, s.[type] ORDER BY s.backup_finish_date DESC)
        FROM msdb.dbo.backupset s
        WHERE s.[type] IN ('D', 'L')
    ) f
    WHERE f.RowNum = 1
    GROUP BY f.database_name
) bu ON d.name = bu.database_name

ORDER BY t.total_size DESC

пятница, 23 октября 2015 г.

Отключение дефолтного gateway у VPN в Windows 10

При создании VPN всегда автоматически ставится галочка "use default gateway on remote network" в подключении, т.е. весь трафик идёт через VPN.
Раньше всё решалось довольно просто:

Но в Windows 10 кнопочка "properties" нихера не работает (баг или фича?). Нашёл вариант как галочку снять через powershell:

Set-VpnConnection -Name "VPN Name" -SplitTunneling $True

понедельник, 30 июня 2014 г.

Автоматическое добавление * (asterisk) в поле поиска в Dynamics CRM 2013

Зайдите на сервере в папку
C:\Program Files\Microsoft Dynamics CRM\CRMWeb\_static\_common\scripts\

Откройте файл "stage.js" и измените строку:
sFindCriteria=Trim(findCriteria.value.replace(/[\*]+/,"*"));findCriteria.value=sFindCriteria;
и замените на:
sFindCriteria=Trim(findCriteria.value.replace(/[\*]+/,"*"));if (sFindCriteria != "" && sFindCriteria.substr(0, 1) != "*") sFindCriteria = "*" + sFindCriteria;findCriteria.value=sFindCriteria;

Сбросьте кеш в браузере. Теперь, при вводе в поле поиска значения автоматически будет добавляться в начале знак *, если его там нет.

пятница, 25 апреля 2014 г.

100% CPU после установки Workflow Manager 1.0

Столкнулся с такой проблемой: после установки апдейтов на Workflow Manager 1.0 ушёл в 100% процессор и логи заспамили ошибками типа:

Failed SQL command after 1 tries with error '229'. Exception: System.Data.SqlClient.SqlException (0x80131904): The EXECUTE permission was denied on the object 'InsertTrackingAndStatus', database 'WFInstanceManagementDB', schema 'dbo'.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.CompleteAsyncExecuteReader()
   at System.Data.SqlClient.SqlCommand.EndExecuteNonQueryInternal(IAsyncResult asyncResult)
   at System.Data.SqlClient.SqlCommand.EndExecuteNonQuery(IAsyncResult asyncResult)
   at Microsoft.Workflow.Management.ExecuteNonQueryAsyncResult.OnEndExecuteSql(IAsyncResult result)
   at Microsoft.Workflow.Management.ExecuteSqlAsyncResult.EndAsyncResult(IAsyncResult result)
   at Microsoft.Workflow.Common.BackoffRetryAsyncResult.IsolateWithRetry(IAsyncResult result)
   at Microsoft.Workflow.Common.AsyncResult.AsyncCompletionWrapperCallback(IAsyncResult result)
ClientConnectionId:03eb9da5-56d7-4023-8802-d7844811bac2  Command Details:   SQL Text          : InsertTrackingAndStatus
  SQL Parameters    : 
    > @StatusRecords = Microsoft.Workflow.Management.SqlDataAccessProvider+InstanceStatusValuesCollection
    > @MetadataWithInstanceId = Microsoft.Workflow.Management.SqlDataAccessProvider+MetadataValuesWithInstanceIdCollection
    > @Variables = Microsoft.Workflow.Management.SqlDataAccessProvider+VariablesCollection
    > @TrackingRecords = 
    > @StatusHistoryRecords = 
    > @DebugTraceRecords = Microsoft.Workflow.Management.SqlDataAccessProvider+DebugTraceRecordValuesCollection
    > @RollingStatusHistoryWindowSize = 1000
    > @RollingDebugTraceWindowSize = 5000

Чинится просто, нужно выполнить скрипт на БД WFInstanceManagementDB и WFResourceManagementDB, этим мы дадим необходимые права для роли, под которой действует учётка Workflow Manager 1.0:

IF  EXISTS (SELECT * FROM sys.database_principals WHERE name = N'WFServiceOperators' AND type = 'R')
    BEGIN
                   -- Grant all permissions of stored procedures and tables
                   DECLARE @ObjectName sysname, @ObjectType char(20), @Cmd varchar(300)
                   DECLARE ObjectCursor CURSOR LOCAL FAST_FORWARD
                   FOR SELECT name, type FROM sys.objects UNION SELECT name, 'WFUDT' FROM sys.types WHERE is_user_defined = 1

                   OPEN ObjectCursor
                   FETCH ObjectCursor INTO @ObjectName, @ObjectType
                   WHILE (@@fetch_status <> -1)
                   BEGIN                              
                                  SET @Cmd =
                                    CASE @ObjectType
                                                  WHEN 'P' THEN N'GRANT EXECUTE ON [' + @ObjectName + N'] TO [WFServiceOperators]'  
                                                  WHEN 'WFUDT' THEN N'GRANT CONTROL, REFERENCES ON TYPE::[' + @ObjectName + N'] TO [WFServiceOperators]'  
                                                  ELSE ''
                                    END

                                  IF @Cmd <> ''
                                  BEGIN
                                                 EXEC(@Cmd)
                                  END
                                  FETCH ObjectCursor INTO @ObjectName, @ObjectType
                   END
                   CLOSE ObjectCursor
                   DEALLOCATE ObjectCursor
    END
    GO