Sql-Server-2012

從作業執行時,具有多個語句的儲存過程不會執行所有語句

  • April 2, 2014

** 請參閱下面的更新

我有一個儲存過程(SQL Server 2012),它從表中刪除舊記錄,然後從視圖中插入新記錄以使表與視圖同步。當我從命令行執行該過程時,它按預期工作,所以我把它放在每天早上執行的工作中。當從作業執行該過程時,不會出現錯誤,作業在我預期的一小部分時間內“成功”完成,但沒有記錄插入到表中。刪除有效,但沒有插入任何內容。

為了弄清楚發生了什麼,我在每個語句的兩側添加了一些列印消息,“刪除開始”、“刪除結束”等 - 所有消息都顯示在作業日誌中 - 所以程式碼正在逐步執行,它只是不向表中插入任何記錄。

我的第一個傾向是它是某種權限問題,但刪除語句工作正常,而且我有其他作業配置有相同的所有者,插入沒有問題。我仔細檢查了“鏡像”模式,作業中列出的所有者已啟用插入、更新、刪除、選擇權限。(仍然可能是權限問題,我在這方面沒有做太多配置,歡迎提供見解。)

實際的語句很長(雖然並不復雜),所以這裡是它使用相同語法所做的簡化版本。我實際上不認為問題出在程式碼上,因為從命令行執行時,它工作正常,但無論如何 - 也許它會提示我需要的正確 Q/A。

任何關於在哪裡尋找的想法將不勝感激:

****** 2014-03-27 一些更新:我突然想到嘗試刪除刪除部分並只插入一個插入,只是為了隔離問題。同樣的結果,插入沒有發生,工作成功。所以我想這不是關於有多個語句,而是插入不起作用,完全沒有問題。**

**還嘗試將所有者更改為我自己以及另一個使用者,但由於以下原因導致工作失敗

“無法確定作業 CRM 報告數據集更新的所有者 (PRELIANT\reports) 是否具有伺服器訪問權限”

作為參考,以下是作業“成功”時來自作業歷史消息視窗的確切消息:日期 2014 年 3 月 27 日上午 7:33:11 記錄作業歷史(CRM 報告數據集更新)

步驟 ID 2 伺服器 ULYSSES 作業名稱 CRM 報告數據集更新 步驟名稱 tblPhoneCall 插入持續時間 00:00:54 Sql Severity 0 Sql Message ID 0 Operator Emailed

Operator Net sent

Operator Paged

Retries Attempted 0

消息以使用者身份執行:PRELIANT\reporting。開始插入

$$ SQLSTATE 01000 $$(消息 0)完成插入$$ SQLSTATE 01000 $$(消息 0)。這一步成功了。

/* remove all records from mirror that are not 'complete' (complete records are read only and will not change) */
   delete MyDB.mirror.tblPhoneCall
   where statecode <> 1 ;

/* remove records from mirror that were deleted from CRM */
   delete tbl
   from 
       MyDB.mirror.tblPhoneCall tbl left join
       AnotherDB.dbo.PhoneCall vw on vw.ActivityId = tbl.activityid
   where
       vw.ActivityId is null;

/* insert all records from CRM where there is no match on mirror table, which now includes new records, or records that were not previously completed */
insert MyDB.mirror.tblPhoneCall
(
   activityid
   , field1
   , field2
)
select 
   vw.activityid
   , vw.field1
   , vw.field2
from 
   AnotherDB.dbo.FilteredPhoneCall vw left join
   MyDB.mirror.tblPhoneCall tbl on tbl.activityid = vw.activityid

where
   tbl.activityid is null;

```**

**事實證明,無論他們使用 SQL Server 多麼出色,論壇領域的任何人都無法猜到答案。這是這裡沒有人知道的應用程序級安全性。

作為插入數據源的 CRM 數據庫包含在應用程序前端管理的系統使用者表。開發該軟體的供應商對其進行了設置,但由於他們沒有留下任何文件,因此這裡沒有人知道後端的安全層。這在很大程度上是令人困惑的,因為安全性只影響某些視圖 - 所以所有其他正在工作的工作都需要來自不受安全性影響的表和視圖的資訊。

以我身份登錄測試時,該過程有效,因為我在 CRM 表中設置為管理員,但用於執行 SQL Server 代理的憑據甚至不存在於 CRM 使用者表中。

與 SQL Server 安全性無關,但與權限有關(沒看到)…**

引用自:https://dba.stackexchange.com/questions/61816