2017-12-16 17 views
0

私はそうのような特定のトリガーの状態を切り替えるための私のOracleデータベースにプロシージャを作成しました:OracleプロシージャはEF6から呼び出されませんか?

CREATE OR REPLACE PROCEDURE MYSCHEMA.PROC_SWITCH_TRIGGER_STATUS AS 
    vStatus VARCHAR(10); 
    vAction VARCHAR(10):= 'ENABLE'; 
BEGIN 
    SELECT STATUS INTO vStatus FROM USER_TRIGGERS 
     WHERE TRIGGER_NAME = 'MY_TRIGGER_NAME'; 
    IF vStatus = 'ENABLED' THEN 
     vAction := 'DISABLE'; 
    END IF; 
    EXECUTE IMMEDIATE 'ALTER TRIGGER MY_TRIGGER_NAME ' || vAction; 
END PROC_SWITCH_TRIGGER_STATUS; 
/

を私はこれを確認したデータベース内で直接実行時に完璧に動作し、事は私がしたいですEFを使用してC#コードから実行します。私はそれが可能になり、次のステートメントのいずれかで考えた:

  • db.Database.SqlQuery<object>("BEGIN MYSCHEMA.PROC_SWITCH_TRIGGER_STATUS END;");
  • db.Database.SqlQuery<object>("CALL MYSCHEMA.PROC_SWITCH_TRIGGER_STATUS();");
  • db.Database.SqlQuery<object>("EXEC MYSCHEMA.PROC_SWITCH_TRIGGER_STATUS;");

それらを実行した後、トリガーのステータスには影響ありません、それは同じまま。注意SqlQueryジェネリック型のパラメータにobjectを使用しました。なぜなら、私の手続きは何も返しません。私は実際にそれが正しいかどうかわかりませんが、エラーは返されません。私はそれが次のように動作していないテスト:

class _Status { public string STATUS {get; set;} } 
... 
string q = "SELECT STATUS FROM USER_TIGGERS WHERE TRIGGER_NAME='MY_TRIGGER_NAME'"; 
_Status sBefore = db.Database.SqlQuery<_Status>(q); 
<execution of any of the above procedure calls> 
_Status sAfter = db.Database.SqlQuery<_Status>(q); 
Console.WriteLine(sBefore.FirstOrDefault()?.STATUS); 
Console.WriteLine(sAfter.FirstOrDefault()?.STATUS); 

上記の出力は次のとおりです。

ENABLED 
ENABLED 

私はODP.NET、管理ドライバおよびEF 6.2と私の質問/疑問を使用していますプロシージャの呼び出し/呼び出しがトリガのステータスに影響するためには、私に何をするべきかアドバイスできますか?私はデータベースと接続文字列に接続するときに同じUSER/SCHEMAを使用しています。前もって感謝します!

答えて

0

ご迷惑をおかけして申し訳ありません。いずれにしても、DatabaseプロパティにはExecuteSqlCommandがあり、私が望むものを達成することができました。起動するには2つの方法があります:

  • db.Database.ExecuteSqlCommand("CALL MYSCHEMA.PROC_SWITCH_TRIGGER_STATUS()")
  • db.Database.ExecuteSqlCommand("BEGIN MYSCHEMA.PROC_SWITCH_TRIGGER_STATUS; END;")
関連する問題