【发布时间】:2020-06-10 12:48:30
【问题描述】:
我想在使用 powershell 插入数据之前从 oracle 表中删除整个数据,
Add-Type -Path C:\Users\sankar\ODP.NET_Managed_ODAC122cR1\odp.net\managed\common\Oracle.ManagedDataAccess.dll
#Database Connection String & Establish connection
$compConStr = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=xxxxx)(PORT=xxxxx)))(CONNECT_DATA=(SID =xxxxxxxx)));User Id=spcl_init;Password=xxxxxx;Pooling=False"
$connection = New-Object Oracle.ManagedDataAccess.Client.OracleConnection($compConStr)
$connection.open()
$Grouplists = Import-Csv "\\XXX\Techsupportgroups1.csv"
#Deleate existing data from oracle table
$query = "DELETE FROM TableName"
$command=$connection.CreateCommand()
$command.CommandText=$query
#$command.ExecuteNonQuery()
$command.ExecuteReader()
#Insert memebers details into oracle Table
foreach ($Group in $Grouplists){
$MembersList=(Get-QADGroupMember $Group.Group_DL |Get-QADuser -Properties * |where {$_.Type -ne "group" -and $_.AccountIsDisabled -ne "False" -and $_.Samaccountname -notmatch "unixlinuxops"} | Select-Object |Select-Object @{n='Group_Name';e={$Group.Group_Name}},Samaccountname,NTAccountName,UserPrincipalName)
foreach($Member in $MembersList)
{
$GroupName = $Member.Group_Name
$SamAccountName=$Member.SamAccountName
$NTAccountName = $Member.NTAccountName
$UserPrincipleName =$Member.userprincipalname
$query = "INSERT INTO IVISTA_RBAC (Group_Name, SamAccountName,NTAccountName,UserPrincipalName)
VALUES ('$GroupName','$SamAccountName','$NTAccountName', '$UserPrincipleName')"
$command=$connection.CreateCommand()
$command.CommandText=$query
$ds = New-Object system.Data.DataSet
$da = New-Object Oracle.ManagedDataAccess.Client.OracleDataAdapter($command)
[void]$da.fill($ds)
}
}
$connection.Close()
上面的代码会将数据插入到表中,但在插入之前不会从表中删除数据,
【问题讨论】:
-
根据您的需要,
truncate table可能更合适。它比删除更有效,因为它不会生成重做。但是,它是不可逆的,执行隐含提交,因为它是 DDL,而不是 DML,并且未处理外键关系(引发错误)。我有几百万行的表,我的分析师执行删除需要 15 分钟以上。我们将删除替换为需要几微秒的截断。
标签: .net oracle powershell odac