database_scripting.ps1



<#
This simple PowerShell routine scripts out all the user-defined functions,
stored procedures, tables and views in all the databases on the server that
you specify, to the path that you specify.
SMO must be installed on the machine (it happens if SSMS is installed)
To run – set the servername and path
Open a command window and run powershell
Copy the below into the window and press enter – it should run
It will create the subfolders for the databases and objects if necessary.
#>
 
$path = "C:\DEV\DB_SHEMA\DB_SHEMA\output\"
$ServerName = "."
 
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO')
$serverInstance = New-Object ('Microsoft.SqlServer.Management.Smo.Server') $ServerName
 
$serverInstance.ConnectionContext.LoginSecure=$true;
#$serverInstance.ConnectionContext.LoginSecure=$false;
#$serverInstance.ConnectionContext.set_Login("");
#$serverInstance.ConnectionContext.set_Password("")
 
$IncludeTypes = @("tables","StoredProcedures","Views","UserDefinedTypes","UserDefinedFunctions")
$ExcludeSchemas = @("sys","Information_Schema")
Test-Path C:\DEV\DB_SHEMA\DB_SHEMA\output\\* -exclude *master*,*msdb*,*tempdb*,*model*
 
$so = new-object ('Microsoft.SqlServer.Management.Smo.ScriptingOptions')
 
$so.AllowSystemObjects = 0
$so.AnsiPadding = 0
$so.Bindings = 1
$so.ClusteredIndexes = 1
$so.ContinueScriptingOnError = 1
$so.ConvertUserDefinedDataTypesToBaseType = 0
$so.DdlBodyOnly = 0
$so.Default = 1
$so.DriAll = 1
$so.DriAllConstraints = 1
$so.DriAllKeys = 1
$so.DriChecks = 1
$so.DriClustered = 1
$so.DriDefaults = 1
$so.DriForeignKeys = 1
$so.DriIndexes = 1
$so.DriNonClustered = 1
$so.DriPrimaryKey = 1
$so.DriUniqueKeys = 1
$so.DriWithNoCheck = 1
$so.EnforceScriptingOptions = 1
$so.ExtendedProperties = 1
$so.FullTextCatalogs = 1
$so.FullTextIndexes = 1
$so.FullTextStopLists = 1
$so.IncludeDatabaseContext = 0
$so.IncludeDatabaseRoleMemberships = 1
$so.IncludeHeaders = 0
$so.IncludeIfNotExists = 0
$so.Indexes = 1
$so.NoCommandTerminator = 0
$so.NoFileGroup = 0
$so.NoViewColumns = 1
$so.NonClusteredIndexes = 1
$so.SchemaQualify = 0
$so.SchemaQualifyForeignKeysReferences = 1
$so.ScriptBatchTerminator = 1
$so.ScriptData = 0
$so.ScriptDrops = 0
$so.ScriptOwner = 0
$so.ToFileOnly = 1
$so.Triggers = 1
 
$dbs=$serverInstance.Databases
 
# DATABASE
foreach ($db in $dbs)
{
	$dbname = "$db".replace("[","").replace("]","")
	$dbpath = "$path"+"$dbname" + "\"
	if ($dbname -notin "AdventureWorks2014", "AdventureWorksDW2014" )
	{
		continue
	}
 
	if ( !(Test-Path $dbpath))
	{
		$null=new-item -type directory -name "$dbname"-path "$path"
	}
 
	# Object type
	foreach ($Type in $IncludeTypes)
	{
		$objpath = "$dbpath" + "$Type" + "\"
		if ( !(Test-Path $objpath))
		{
			$null=new-item -type directory -name "$Type"-path "$dbpath"
		}
 
		# Object
		foreach ($objs in $db.$Type)
		{
			If ($ExcludeSchemas -notcontains $objs.Schema )
			{
				$ObjName = "$objs".replace("[","").replace("]","")
				$OutFile = "$objpath" + "$ObjName" + ".sql"
				$TempFile = "$objpath" + ".TMP"
				$objs.Script($so)+"GO" | out-File $OutFile
				if ($Type -in "StoredProcedures", "UserDefinedFunctions", "tables", "Views")
				{
					$org = (Get-Content $OutFile)
					$so.Permissions = 1
					$so.AppendToFile = 1
					$so.NoCommandTerminator = 0
					$so.ScriptBatchTerminator = 1
					$objs.Script($so) | out-File $TempFile
					$addpermission = (Get-Content $TempFile)
					Compare-Object $addpermission $org -property $_.InputObject -passThru | Where-Object { $_.SideIndicator -eq '<=' } | out-File $OutFile -Append
					$so.Permissions = 0
					$so.AppendToFile = 0
					$so.NoCommandTerminator = 1
					$so.ScriptBatchTerminator = 0
					remove-item $TempFile
				}
 
			}
		}
	}
}



WRITTEN BY
blushine
개인자료 보관 용도의 블로그 입니다.

,

 

Postgresql 에서 자주 사용하는데 없어서 만들어 놓은 매크로..

빈 스페이스로 조회 할 경우 전체 목록을 보여주고 특정 범위로 선택해서 조회 가능 함..

SQL server management studio (SSMS) 에서 사용하는 단축키로 등록 해서 사용함

alt + f1 sp_help

SELECT  Quote_ident(nspname)  || '.'  || Quote_ident(relname) AS table_name,
 Quote_ident(attname)  AS field_name,
 Format_type(atttypid, atttypmod)  AS field_type,
 CASE  WHEN attnotnull THEN ' NOT NULL'  ELSE '' END AS null_constraint,
 CASE  WHEN atthasdef THEN 'DEFAULT '    ||   (
    SELECT Pg_get_expr(adbin, attrelid)
    FROM   pg_attrdef
    WHERE  adrelid=attrelid
    AND adnum = attnum )::text
  ELSE '' END AS dafault_value,
 CASE
  WHEN NULLIF(confrelid, 0) IS NOT NULL THEN confrelid::regclass::text    || '( '    || array_to_string( array
   (
   select   quote_ident( fa.attname )
   FROM  pg_attribute AS fa
   WHERE fa.attnum = ANY ( confkey )
   AND   fa.attrelid = confrelid
   ORDER BY fa.attnum ), ',' )
    || ' )'
  ELSE '' END AS references_to
FROM pg_attribute
 LEFT OUTER JOIN pg_constraint
  ON conrelid = attrelid
   AND attnum = conkey[1]
   AND array_upper( conkey,1) = 1
 INNER JOIN pg_class
  ON pg_class.oid = pg_attribute.attrelid
 INNER JOIN pg_namespace
  ON pg_namespace.oid = pg_class.relnamespace
WHERE (
  1 = CASE WHEN btrim( '$SELECTION$' ) = '' THEN 1 ELSE 0 END
 OR  pg_class.oid = btrim( '$SELECTION$' )::regclass::oid
) AND (
  1 = CASE WHEN btrim( '$SELECTION$' ) = '' THEN 0 ELSE 1 END
 OR  attrelid > 1262
) AND attnum > 0
AND NOT attisdropped
AND Quote_ident(nspname) NOT IN ('pg_catalog', 'pg_toast')
ORDER BY attrelid, attnum;

 

alt + f2 sp_helpindex

SELECT
    n.nspname  as "schema",
    t.relname  as "table",
    c.relname  as "index",
    pg_get_indexdef(indexrelid) as "def"
FROM pg_catalog.pg_class c
    INNER JOIN pg_catalog.pg_namespace n
        ON n.oid = c.relnamespace
    INNER JOIN pg_catalog.pg_index i
        ON i.indexrelid = c.oid
    INNER JOIN pg_catalog.pg_class t
        ON i.indrelid   = t.oid
WHERE c.relkind = 'i'
    and n.nspname not in ('pg_catalog', 'pg_toast')
    and pg_catalog.pg_table_is_visible(c.oid)
    and (1 = CASE WHEN btrim( '$SELECTION$' ) = '' THEN 1 ELSE 0 END OR t.relname = btrim( '$SELECTION$' ))
ORDER BY
    n.nspname,
    t.relname,
    c.relname;



WRITTEN BY
blushine
개인자료 보관 용도의 블로그 입니다.

,

Couchbase Server 4.0 — DEVELOPER PREVIEW 가 나온김에 필요한 몃가지 사항을 정리

1. 개선 되었다고 이야기 하는 주요 항목 은 아래와 같다.

Multi-dimensional scaling

SQL for Documents (N1QL)

Indexing

Spatial views

Security

 

이중 각 항목의 내용을 조금 살펴보면

2. Multi-dimensional scaling 은 동일 노드에 동일 서비스가 사용되었던 것을 서비스 별로 다중 노드로 나눠서 처리 한다는 컨셉

이전 모델

현재는 쿼리 엔진이나 인덱스 서비스 부분의 성능 이슈로 특정 영역이 느려지거나 전체 노드가 영향을 받게 되는 구조다.

clip_image001[1]

변경된 모델 (각각의 서비스 별로 노드를 지정 가능 하여 서비스 하는 형태다.)

특히 서비스 별로 병목이 되는 노드를 스케일을 다르게 하여 서비스 가능 하도록 구성이 가능 해졌다!

clip_image002[1]

예를 들자면 )

성능 병목이 되는 인덱스 서비스나 쿼리 엔진에서 사용하는 서비스를 별도의 노드로 분리 가능 해진것!

(사실 쿼리엔진 자체는 기존에도 분리 가능 한 형태였음..)

clip_image003[1]

3. SQL for Documents (N1QL) 정식 릴리즈 (예정)

3.0 버전에서 N1QL DP 4 버전 이후 정식 릴리즈 된 서비스로 SQL로 질의하여 처리가 가능한 서비스 이다.

clip_image004[1]

분산 데이터 베이스 모델이라 vBucket에 따라 데이터가 나뉘게 되는데 이를 map & reduce 형태로 찾아서 처리 하게 되므로, VIEW로 인덱스를 만들어서 사용하는 형태를 추천 한다.

결론적으로 N1QL은 VIew의 처리 성능이나 Primary Key Access로 처리 되도록 하는게 성능 상 중요하다.

4. Indexing

Couchbase 인덱스의 경우 그 갯수가 많아 질 경우 성능 이슈가 생기게 되는데.. 그 이슈에 따라 변경된 내용은 아래와 같다.

Independent partitioning of indexes

인덱의 경우 분산된 데이터의 갱신이 완료되거나 해당 인덱스가 갱신되어야만 원하는 데이터의 인덱스의 사용 가능하다.

이를 독립적인 서비스로 분리 하여 로드에 대해서 독립적이 되도록 개선 하였다. ( 하지만 인덱스 갱신으로 인한 성능 이슈는 동일 할듯 싶다. )

다만, 분리된 인덱스를 서비스하는 노드에 대해서 해당 노드의 서버의 성능 스케일을 다르게 가져가서 지연에 대한 영향을 조금이나마 줄일 여지는 있다.

Efficient index building

기존에는 인덱스를 한번에 하나씩 데이터 버킷을 뒤져 가면서 생성 하도록 동작 했었다.

변경된 빌드 옵션에 따라 각 버킷의 데이터를 읽고 다중 인덱스를 동시에 생성 가능 하다고 한다.

인덱스 생성 명령을 실행하기 전까지 여러개의 인덱스에 대한 데이터를 인덱서가 메타정보를 수집하고 생성 서 관련 모든 인덱스를 생성 한다고 한다.

(인덱스 갱신 자체는 XDCR 프로토콜에서 발번한 번호를 받아서 하나씩 순차적으로 갱신 함 )

Filtering for efficient indexing

조건에 따라 인덱스를 구성 해서 데이터 사이즈를 줄이거나 인덱싱에 들어가는 비용을 줄인다고 한다.

(사실 View 인덱스를 Depth 기준으로 나눠서 생성하게 되면 기존과 동일한 형태로 처리 될듯..)

다만, 별도 노드로 인덱스 서비스를 구성 가능 하기에 데이터 복제 스트림 과정에서 인덱스가 필요한 데이터 골라서 전달 하는듯 하다. (확인 필요)

clip_image005[1]

5. Spatial views

GeoJson 기반의 뷰를 만들어서 사용이 가능 해졌다. ( PostGIS 와 비슷한 형태로 구현 가능 할 듯 싶다. )

6. LDAP authentication

인증을 위한 LDAP 기반의 인증 기능이 통합 되어 적용 가능 하다.


WRITTEN BY
blushine
개인자료 보관 용도의 블로그 입니다.

,