2017-08-01 56 views
0

我想運行一個不可靠的任務,如果一個條目更新/刪除/插入到我創建的postgresql表。Ansible - 如何檢查postgresql表更改?

我正在尋找一種方便的方法來實現這一點。如果不開發我自己的模塊,是否可以這樣做?

回答

0

當然你可以用Postgres(9.3開始)觸發。但我認爲這將是一個壞主意。反正只是爲了證明可以在數據改變運行shell命令的方式:

t=# create user no_priv password 'p'; 
CREATE ROLE 
t=# create table r (t text); --to copy from program to 
CREATE TABLE 
t=# create or replace function bad_idea() returns trigger as 
$$ 
begin 
execute format ($f$copy r from program 'echo %s'$f$,TG_OP); 
return new; 
end; 
$$ language plpgsql security definer; 
CREATE FUNCTION 
t=# create table bi (i int); 
CREATE TABLE 
t=# create trigger t before insert ON bi execute procedure bad_idea(); 
CREATE TRIGGER 
t=# insert into bi select 0; 
INSERT 0 1 
t=# insert into bi select 0; 
INSERT 0 1 
t=# select * from r; 
    t 
-------- 
INSERT 
INSERT 
(2 rows) 
t=# grant all on bi, r to no_priv; 
GRANT 

現在合理的問題是什麼用戶no_priv和贈款是。出於顯而易見的原因,您需要超級用戶才能從程序中複製。爲了克服它,我們在函數創建時使用安全性定義,以便證明不是超級用戶仍然可以運行程序:

MacBook-Air:~ vao$ psql -h 192.168.8.110 -d t -U no_priv 
Password for user no_priv: 
Timing is on. 
psql (9.6.1, server 9.6.3) 
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) 
Type "help" for help. 

t=> insert into bi select 0; 
INSERT 0 1 
Time: 53.883 ms 
t=> select * from r; 
    t 
-------- 
INSERT 
INSERT 
INSERT 
(3 rows) 

Time: 72.457 ms