重設 Identity 接下來遞增的值

USE tempdb;
GO
create table t(c1 int identity primary key)
go
insert t default values
go 20

delete t where c1 < 10
go

DBCC CHECKIDENT (‘t’, RESEED,1);
go

–加一筆 2
insert t default values
go
select * from t
GO

 

set identity_insert t on
go
insert t(c1) values(5)
select * from t
go

set identity_insert t off
go

–加一筆 6
insert t default values
select * from t
go

–違反 PK Error
insert t default values
go 20

訊息 2627,層級 14,狀態 1,行 34
違反 PRIMARY KEY 條件約束 ‘PK__t__3213663BA6D0B54B’。無法在物件 ‘dbo.t’ 中插入重複的索引鍵。重複的索引鍵值是 (10)。
陳述式已經結束。
** 執行批次時發現錯誤。正在繼續。

drop table t

管理 Server Core 伺服器並安裝 SQL Server 2014

管理 Server Core 伺服器 https://technet.microsoft.com/zh-tw/library/jj574205.aspx#BKMK_1_5

設定 Server Core 伺服器 https://technet.microsoft.com/zh-tw/library/jj592692.aspx

在 Server Core 伺服器上安裝伺服器角色和功能 https://technet.microsoft.com/zh-tw/library/jj574158.aspx

裝 SQL Server 前需要先裝 .NET Framework 3.5:Install-WindowsFeature Net-Framework-Features –source D:\Sources\sxs

在 Server Core 上安裝 SQL Server 2014 https://msdn.microsoft.com/zh-tw/library/hh231669.aspx

紀錄 Reporting Services 的訂閱執行歷程

因為 RS 的訂閱 log 是寫在 file 內,預設 system table Subscriptions 只有 laststatus,因應朋友 Jay 的需求,他提醒可以用 trigger 來記錄:

use ReportServer
go
SELECT [SubscriptionID]
      ,[LastStatus]
      ,[LastRunTime] into tbRecord
  FROM [ReportServer].[dbo].[Subscriptions]
  where 1=0
  go

 

create trigger trgSub on Subscriptions
  for update,insert
  as
  insert tbRecord select [SubscriptionID]
      ,[LastStatus]
      ,[LastRunTime] from inserted
go

select * from Subscriptions
select * from tbRecord

 

 

此外,要小心規劃清掉 log 的排程

設定 PowerShell 的 Credential Delegation

看來 PowerShell 若不設定 Credential Delegation 無法在遠端存取共享資源…

從 N1 透過 PowerShell 遠端登入到 N3,並要求 N3 存取共享資源,會有因為沒有身分而授權失敗的錯誤:

image

範例語法:

PS C:\Users\administrator.I> Enter-PSSession -ComputerName n3

[n3]: PS C:\Users\administrator.I\Documents> dir \\n1\logs
dir : 存取被拒。
    + CategoryInfo          : PermissionDenied: (\\n1\logs:String) [Get-ChildItem], UnauthorizedAccessException
    + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
 
dir : 找不到 ‘\\n1\logs’ 路徑,因為它不存在。
    + CategoryInfo          : ObjectNotFound: (\\n1\logs:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

參考 https://rkeithhill.wordpress.com/2009/05/02/powershell-v2-remoting-on-workgroup-joined-computers-%E2%80%93-yes-it-can-be-done/ 設定 Credential Delegation

  • 因為要連到 N3,所以 N3 現在扮演 Server,在 N3 以系統管理員身分執行 Enable-WSManCredSSP -Role Server

image

  • 在 Client,也就是 N1 執行 Enable-WSManCredSSP -Role Client -DelegateComputer n3

image

沒有做文中的群組原則設定,已經可以存取:

image

不知是否是測試用的機器在 Domain 內,可以走 Kerberos 而非 NTLM

image

 

在測通之後,嘗試透過以下的語法,從 n1 發起,一次存取 n1,n2,n3 的 log,放回到 \\n1\logs 共享目錄:

$ScriptPath=($MyInvocation.MyCommand.Path | Split-Path) + "\"
$cred=New-Object System.Management.Automation.PSCredential  (Get-Content ($ScriptPath + "id.txt")),(ConvertTo-SecureString (Get-Content ($ScriptPath + "pwd.txt")) -AsPlainText -Force)

Invoke-Command -ComputerName (Get-Content ( $ScriptPath + "ServerName.txt")) `
-FilePath ($ScriptPath + "GetMultiServerSQLInstanceProperties.ps1") `
-Credential $cred -Authentication Credssp

得到如下的錯誤:

[N1] 連線到遠端伺服器 N1 失敗,傳回下列錯誤訊息: WinRM 用戶端無法處理該要求。電腦原則不允許委派使用者認證至目標電腦。 請使用 gpedit.msc 並查看下列原則: 電腦設定 -> 系統管理範本 -> 系統 -> 認證委派 -> 允許委派新認證。 請確認已啟用該原則且設定適合目標電腦的 SPN。 例如,目標電腦名稱若為 "myserver.domain.com
",SPN 可為下列其中之一: WSMAN/myserver.domain.com 或 WSMAN/*.domain.com。 如需詳細資訊,請參閱 about_Remote_Troubleshooting 說明主題。
    + CategoryInfo          : OpenError: (N1:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : -2144108125,PSSessionStateBroken
[N2] 連線到遠端伺服器 N2 失敗,傳回下列錯誤訊息: WinRM 用戶端無法處理該要求。電腦原則不允許委派使用者認證至目標電腦。 請使用 gpedit.msc 並查看下列原則: 電腦設定 -> 系統管理範本 -> 系統 -> 認證委派 -> 允許委派新認證。 請確認已啟用該原則且設定適合目標電腦的 SPN。 例如,目標電腦名稱若為 "myserver.domain.com
",SPN 可為下列其中之一: WSMAN/myserver.domain.com 或 WSMAN/*.domain.com。 如需詳細資訊,請參閱 about_Remote_Troubleshooting 說明主題。
    + CategoryInfo          : OpenError: (N2:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : -2144108125,PSSessionStateBroken

可以理解,因為 Enable-WSManCredSSP -Role Client -DelegateComputer n3 執行時,並未有包含 n1,n2,但再度執行 Enable-WSManCredSSP -Role Client -DelegateComputer n3,n1,n2 依然有如上的錯誤

所以直接透過本機群組原則編輯器加入:

image

image

image

image

 

若在 N2 未以系統管理員身分執行 Enable-WSManCredSSP -Role Server,依然會有相同錯誤訊息

但 n1 自己對自己永遠失敗,改以 SPN 才行:

image

image

換句話說,n1 連 n1 自己,要用 n1.i.com (我的 domain 取 i.com)

參考資源:

https://technet.microsoft.com/en-us/magazine/jj853299.aspx

http://www.ravichaganti.com/blog/wp-content/uploads/2010/12/A%20layman’s%20guide%20to%20PowerShell%202.0%20remoting-v2.pdf

透過 PowerShell 部署 AS DB 和 rdl 到 SharePoint

SQL 制式教材內,透過 PowerShell 部署 AS DB 和 rdl 到 SharePoint 的 Script 可以參考:

#執行 xmla 部署 AS DB

Import-module sqlps
Import-module sqlascmdlets
Invoke-ASCmd -Inputfile:"$env:SUBDIR\SetupFiles\SetupSSAS.xmla" -Server:"localhost"

 

#部署  rdl 到 SharePoint

Add-PSSnapin Microsoft.SharePoint.PowerShell
$siteName = "http://localhost/sites/adventureworks"
$docLibName = "Reports"

$web = Get-SPWeb $siteName
$docLib = $web.Lists[$docLibName]
$rootFolder = $docLib.RootFolder
$folderURL = $rootFolder.Url
$folder = $web.GetFolder($folderURL)
foreach ($file in $folder.Files) {
  $docLib.Items.DeleteItemById($file.Item.Id)
}

$subs = @()

foreach($subfolder in $folder.SubFolders) {
  if ($subfolder.Name -ne "Forms") {
      $subs = $subs + $subfolder.Url
  }
}

foreach ($url in $subs) {
  $folder.SubFolders.Delete($url)
}

$folderName = "$env:SUBDIR\SetupFiles\Reports"
$files =  ([System.IO.DirectoryInfo] (Get-Item $folderName)).GetFiles() | ForEach-Object {
    $fileStream = ([System.IO.FileInfo] (Get-Item $_.FullName)).OpenRead()
    $content = New-Object byte[] $fileStream.Length
    $fileStream.Read($content, 0, [int]$fileStream.Length);
    $fileStream.Close()
    $spFile = $rootFolder.Files.Add($rootFolder.Url + "/" + $_.Name, $content, $true)
}

AS Tabular Model 的輔助小工具

比較資料庫、部署、合併程式碼、與 TFS 整合:BISM Normalizer

輔助 BIDS/SSDT 開發 AS 模型,例如為 Tabular 建立 Drillthrough Action(MVA MVA — Implementing Tabular Model Solutions 第四單元透過 DAX Query 回傳 Dataset 的 Action,提供客製化 drillthrough):BIDS Helper

DAX Query 的語法編輯器:DAX Studio

討論 Tabular Model 各種問題的設計模式:DAX patterns

參考資源:MVA — Implementing Tabular Model Solutions

AS Tabular 的 Row Level 的 Role Base Model Security

Tabular Model 設計如下:

image

image

image

角色定義如下:

image

image

以 AS 的 Administrator 角色透過 Connection String 模擬 Role1 的結果

image

Provider=MSOLAP.6;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=TabularProject1_Byron_6f652aee-a22e-41fb-8df2-d60c4b278c0e;Data Source=SQL2014\I2;MDX Compatibility=1;Roles=Role1;Safety Options=2;MDX Missing Member Mode=Error;Optimize Response=3;Cell Error Mode=TextValue

 

直接以 C 帳號登入的結果

image

搭配 RS 時,透過動態產生連接字串:

image

其內容定義:

image

=IIF(Parameters!Role.Value="None","Provider=MSOLAP.6;Data Source=.\i2;Initial Catalog=TabularProject1","Provider=MSOLAP.6;Data Source=.\i2;Initial Catalog=TabularProject1;Role=" + Parameters!Role.Value)

報表參數定義:

image

報表設計如下:

image

其執行結果如下:

image

 

另外,有點奇怪的是:

在設計報表時,若資料來源選用 Analysis Services

image

則查詢一定要用 MDX 的產生器,因此不能寫 DAX

image

但若資料來源採用 OLE DB 的 Microsoft OLE DB Provider for Analysis Services 12.0

image

則可以自行編輯 DAX

image

由於 DirectQuery 只支援 DAX,所以若要採用 DirectQuery Mode 而非 InMemory Mode,且要利用 RS 呈現,或可如此撰寫 DAX

上述範例專案與報表:

https://onedrive.live.com/redir?resid=BF14192BD27975CB!56936&authkey=!AEM6dSaoa70pNmk&ithint=file%2czip

參考資料:

MVA — Implementing Tabular Model Solutions

Use EffectiveUserName with Excel Services (SharePoint Server 2013)

Buildin\Administrators 的帳號登入 SQL Server 時,小心被 UAC 降帳戶

James 提了個有趣的問題,在 SQL Server 加入 Windows 的 Administrators 群組時,要用 Buildin\Administrators 加入,但屬於該群組的使用者依然無法登入。而這應是被 UAC 影響的,該 User 要 Run As Administrator 後開啟程式才能登入。

透過 PowerShell 搭配 WebDAV 與 HTTPS 上傳資料

設定 WebDAV:http://www.iis.net/configreference/system.webserver/webdav

image

IIS  建立自我簽署憑證並啟動 HTTPS

PowerShell:

$wc = new-object System.Net.WebClient
$wc.Credentials=new-object System.Net.NetworkCredential("account","password","domain")
$uri=https://server:port/
ls C:\temp\*.zip | foreach {
    $wc.UploadFile($($uri+$_.Name) ,"PUT", $_.FullName )
}

VS 2013 Update 4 造成 Web Template 損毀

狀況:

image

確定後的錯誤訊息

image

透過控制台修復

image

image

修復後就正常了

參考: http://stackoverflow.com/questions/26955822/visual-studio-2013-update-4-has-broken-web-templates

關注

Get every new post delivered to your Inbox.

Join 26 other followers