2014-07-21 23 views
0

我試圖從服務器A向服務器B恢復數據庫。由於某種原因,導入在3條特定INSERT語句上失敗:嘗試將記錄插入postgrsql數據庫時出現「無效組合字段1字段2字段3」錯誤消息

INSERT INTO tbl1 (device_id, group_name, param_id, value) VALUES (15, 'regX', 13, '4323'); 
INSERT INTO tbl1 (device_id, group_name, param_id, value) VALUES (15, 'device', 1, 'aatd'); 
INSERT INTO tbl1 (device_id, group_name, param_id, value) VALUES (15, 'regX', 14, 'ttdf'); 

返回的錯誤是:

ERROR: Invalid combination of device, group, and parameter

這是同樣的錯誤每個記錄。

這裏的表的定義是什麼樣子:看起來類似的工作,沒有問題

testdb=# \d+ tbl1; 
          Table "public.tbl1" 
    Column |   Type   | Modifiers | Storage | Stats target | Description 
------------+------------------------+-----------+----------+--------------+------------- 
device_id | integer    |   | plain |    | 
group_name | character varying(255) |   | extended |    | 
param_id | integer    |   | plain |    | 
value  | character varying(255) |   | extended |    | 

其他記錄。例如:

INSERT INTO tbl1 (device_id, group_name, param_id, value) VALUES (103, 'regX', 13, '130'); 

事實上,數據庫/導入文件有900多條記錄,這些是唯一的3個失敗的記錄。

如何創建轉儲文件/我如何導入轉儲:

要出口:

pg_dump --create -U postgres origdb > outputfile.sql 

然後在新服務器上,導入:

psql -f outputfile.sql -U postgres 

我到目前爲止試過的東西:

  1. 我已經確認在原始數據庫中存在這些記錄,並且匹配dump命令生成的內容。 下面是數據看起來像在原來的數據庫:
origdb=# select * from tbl1 where device_id = 15; 

device_id | group_name | param_id | value  
-----------+------------+----------+-------------- 
     15 | regX  |  13 | 4323 
     15 | device  |  1 | aatd 
     15 | regX  |  14 | ttdf 
(3 rows) 
  1. 我試圖手動導入這些記錄在新服務器上與導入整個轉儲文件。我收到相同的錯誤消息。

  2. 我也一直在檢查,看看PK的已定義的是什麼...

testdb=# SELECT
pg_attribute.attname, format_type(pg_attribute.atttypid, pg_attribute.atttypmod) FROM pg_index, pg_class, pg_attribute, pg_namespace WHERE pg_class.oid = 'tbl1'::regclass AND indrelid = pg_class.oid AND nspname = 'public' AND pg_class.relnamespace = pg_namespace.oid AND pg_attribute.attrelid = pg_class.oid AND pg_attribute.attnum = any(pg_index.indkey) AND indisprimary;

attname | format_type 
---------+------------- 
(0 rows) 

問題:

  1. 我不太肯定它的在錯誤信息中獲取名稱「設備,組和參數」......這些對應的是什麼?我假設字段名稱,但我怎麼能驗證這一點?

  2. 關於還需要檢查以排除故障的任何建議?我只是狩獵尋找這張桌子上的任何外鍵等。但任何建議,將不勝感激。 我沒有製作這個數據庫,所以我不確定所有的關係等。

謝謝。

回答

0

這看起來像是阻止這些特定插入並顯示自定義消息的觸發器。 觸發器可以在原始數據庫中禁用,但不能在新的數據庫中使用。 用這個命令看你的用戶創建的觸發器:

SELECT * FROM pg_trigger; 
+0

啊!有趣。我確實在該表中看到了一些看起來可疑的觸發器。問題:爲什麼你說我不能在新的數據庫中禁用觸發器?謝謝! – dot

+0

我的意思是,在原始殘疾但現在在新的激活。您可以禁用表tbl1的所有觸發器: 'ALTER TABLE tbl1 DISABLE TRIGGER USER' – Teixi

相關問題