VM 設定:1 Socket 1 Core 設定
修正 VM CPU 設定值,從 1 Socket 1 Core 改為 1 Socket 2 Core
在 SQL Server 中,您可以在 ALTER DATABASE 陳述式的 FILENAME 子句中指定新的檔案位置,以便將使用者資料庫的資料、記錄和全文檢索目錄檔案移到新位置。 這種方法適用於在相同的 SQL Server執行個體內移動資料庫檔案。 若要將資料庫移到另一個 SQL Server 執行個體或移到另一個伺服器,請使用備份和還原或卸離和附加作業。
SELECT
DB_NAME([database_id]) AS [database_name],
[state_desc] AS OnlineStatus,
[file_id],
[type_desc] AS [file_type],
[name] AS [logical_name],
[physical_name]
FROM sys.[master_files]
WHERE [database_id] IN (DB_ID('DemoDBMove'))
ORDER BY [type], DB_NAME([database_id]);
-- Step1:設定 DB 離線
ALTER DATABASE DemoDBMove SET OFFLINE WITH ROLLBACK IMMEDIATE;
-- Step2:透過上述查詢語法找出 logical_name 並設定 DemoDBMove mdf 和 ldf 檔案位置至 D:\Temp 去
ALTER DATABASE DemoDBMove MODIFY FILE ( NAME = DemoDBMove, FILENAME = 'D:\Temp\DemoDBMove.mdf');
ALTER DATABASE DemoDBMove MODIFY FILE ( NAME = DemoDBMove_log, FILENAME = 'D:\Temp\DemoDBMove_log.ldf');
-- Step3:從原檔案位置搬移 DemoDBMove mdf 和 ldf 檔案至 D:\Temp 去
-- Step4:設定 DB 上線
ALTER DATABASE DemoDBMove SET ONLINE;
-- 建立 DBViewDemo 使用者
CREATE LOGIN [DBViewDemo] WITH PASSWORD=N'P@ssW0rd'
-- 隱藏全部 DB
DENY VIEW ANY DATABASE TO [DBViewDemo]
-- 授予 DBViewDemo AdventureWorks2017 DB 存取權限,設定後會是 db_owner
ALTER AUTHORIZATION ON DATABASE::[AdventureWorks2017] TO [DBViewDemo]
設定後結果
USE AdventureWorks2017
GO
-- 建立 Master、Detail Table
DROP TABLE IF EXISTS tblMaster
DROP TABLE IF EXISTS tblDetail
CREATE TABLE tblMaster (MasterID int Primary Key)
CREATE TABLE tblDetail (DetailID int Primary Key, MasterID int)
-- 建立 Master、Detail 之間的 Foreign Key
ALTER TABLE [dbo].[tblDetail] WITH CHECK ADD CONSTRAINT [FK_tblDetail_tblMaster] FOREIGN KEY(MasterID)
REFERENCES [dbo].[tblMaster] (MasterID)
-- 建立 Detail 上,Foreign Key 對應欄位 Index
CREATE INDEX IX_tblDetail_MasterID ON tblDetail (MasterID)
CASE1:Foreign Key 和 IX_tblDetail_MasterID 同時存在,刪除 Master 單筆資料
DELETE FROM tblMaster WHERE MasterID = 1
從下方執行計畫可以觀察到,只刪除 Master Table 資料,有 Foreign Key 情況下,會利用 Index Seek 搜尋 Detail Table 內資料-- 移除 IX_tblDetail_MasterID Index
DROP INDEX IX_tblDetail_MasterID ON tblDetail
DELETE FROM tblMaster WHERE MasterID = 2
從下方執行計畫可以觀察到,只刪除 Master Table 資料,有 Foreign Key 情況下,因為移除 Index,所以是利用 Index Scan 搜尋 Detail Table 內資料-- 移除 Foreign Key
ALTER TABLE dbo.tblDetail DROP CONSTRAINT FK_tblDetail_tblMaster
DELETE FROM tblMaster WHERE MasterID = 3
從下方執行計畫可以觀察到,只刪除 Master Table 資料,沒有 Foreign Key 情況下並不會對 Detail Table 進行任何搜尋using Dapper;
namespace SubReport
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
reportViewer1.LocalReport.ReportEmbeddedResource = "SubReport.子報表.rdlc";
List<RVMPurch> PurchList = GetRVMPurch();
// 故意把報表內資料集名稱取的跟 Class 一樣
reportViewer1.LocalReport.DataSources.Add(new ReportDataSource(nameof(RVMPurch), PurchList));
reportViewer1.LocalReport.SubreportProcessing += LocalReport_SubreportProcessing;
reportViewer1.RefreshReport();
}
private void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e)
{
string PurNO = e.Parameters["PurNO"].Values[0]?.ToString();
List<RVMPurchDetail> PurchDetailList = GetRVMPurchDetails(PurNO);
// 故意把報表內資料集名稱取的跟 Class 一樣
e.DataSources.Add(new ReportDataSource(nameof(RVMPurchDetail), PurchDetailList));
}
#region DB 存取相關
private string ConnectionString = @"Data Source=.\SQL2017;Initial Catalog=AdventureWorks2017;Integrated Security=True;";
private List<RVMPurch> GetRVMPurch()
{
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
string TSQL = @"
SELECT
P.* ,
E.EmpName ,
S.SPLName ,
S.Contact ,
S.Tel ,
S.Fax
FROM Purch AS P
JOIN Employ AS E ON P.PurEmpNO = E.EmpNO
JOIN Supplier AS S ON P.SPLNO = S.SPLNO";
return conn.Query<RVMPurch>(TSQL).ToList();
}
}
private List<RVMPurchDetail> GetRVMPurchDetails(string purNO)
{
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
string TSQL = @"
SELECT *
FROM PurchDetail
WHERE PurNO = @PurNO";
object para = new { PurNO = purNO };
return conn.Query<RVMPurchDetail>(TSQL, para).ToList();
}
}
#endregion
}
}
Error:Subreport could not be shown
主報表沒有設定參數,所以沒有參數傳遞至子報表
子報表內沒有對應主報表參數,無法接收參數
主報表和子報表參數資料形態不一致