2015-09-18 69 views
2

我有三個表。 usertaguser_taguser的主要部分是iduser + client,其中之一tagidtag + client。現在我想爲這兩個主鍵創建表user_tag的外鍵,而不需要在那裏有兩個客戶端。如何在ABAP中創建兩個複合外鍵

我該怎麼做?它是如何顯示在輸入幫助/檢查(只有一個輸入源可用,並且client有兩個來源)?

這裏的例子:

client|idtag  client|iduser 
------------- ------------- 
    1 | 1   1 | 3 
    1 | 2   1 | 4 
    2 | 1   2 | 3  

爲我的新表,可能的值:

client|idtag|iduser 
-------------------- 
    1 | 1 | 3 
    1 | 1 | 4  
    1 | 2 | 3 
    1 | 2 | 4 
    2 | 1 | 3  

現在在我的CHECKTABLE我想已經檢查了我的鑰匙在該表。如果我不檢查客戶端,我將有更多的可能性,我不想(不一致):

client|idtag|iduser 
-------------------- 
    2 | 1 | 4  
    2 | 2 | 3 
    2 | 2 | 4 
+0

不知道我是否完全明白你的意思,但客戶端只有一個來源,它是你的程序執行的當前客戶端,所以不需要兩次。這不是您通常手動設置的字段。 – andreas

+0

@andreas所以我沒有做任何事情可以避免,我可以添加一個特定客戶端下不可用的密鑰? – inetphantom

+0

爲什麼你想避免在第一個地方有兩個外鍵的客戶?它屬於那裏在多客戶端環境中強制實施參照完整性。 – vwegert

回答

1

試想想CLIENT(或MANDT)喜歡的東西,是隱含的,好像它不存在並簡單地將外鍵定義爲IDTAG, IDUSER,就好像您正在爲MySQL或Postgres等數據庫那樣做。

我不知道你的要求是什麼,但總是有可能在SAP中定義透明表格而不依賴於客戶端,但這對於應用程序數據來說不太可能,而是用於跨客戶端配置。

+0

因此,環境檢查我是否沒有像我添加的示例中所示的那些情況,我可以忽略它? – inetphantom

+0

我不確定,但你的意思是「環境檢查」。在SAP中,即使定義了檢查表,外鍵也不會傳播到數據庫。因此,如果在客戶端1中執行以下操作,則插入'DATA:ls_rel TYPE zrel。 zrel-idtag = 1. zrel-iduser = 5. INSERT zrel FROM ls_rel.'用戶表中不存在編號爲5的用戶,您將不會收到任何異常,並且該記錄將被插入到數據庫中在這種情況下與客戶無關。試試看!您必須在應用服務器級別自行處理一致性檢查。 – Jagger

1

僅從另一個角度來解釋:當您在SAP中登錄時,您的登錄名是客戶端特定的。

當你寫一個選擇像

SELECT * FROM USER. 
... 
ENDSELECT. 

你只有用實際的客戶端條目。系統在實際客戶端上顯式限制選擇。

如果您想要客戶端獨立選擇,則必須在select語句中使用CLIENT SPECIFIC

換句話說:在正常情況下,不存在來自不同客戶端的數據混合。所以如果您的user_tag只有一個客戶端密鑰,也沒有問題。