簡體   English   中英

如何創建存儲過程以確保每個表都包含某些列?

[英]How do I create a stored proc to ensure that every table contains certain columns?

我有一個Firebird數據庫, 我想確保每個行一次最多可以編輯一個用戶。 為此,我想在每個適用的表上放置一個OWNER列。 手動為每個表執行此操作有點乏味,因此我嘗試編寫一種自動執行此操作的方法。 首先,創建一個視圖,為您提供所有需要更新的表:

CREATE VIEW OWNABLE_TABLES_V
(
  NAME
)
AS
SELECT tables.RDB$RELATION_NAME 
FROM RDB$RELATIONS tables
WHERE (tables.RDB$SYSTEM_FLAG=0) and (tables.rdb$view_source is null)
  and not exists (
    --table containing names of tables that are exceptions to the rule
    select name from META_NOT_OWNABLE 
    where name = tables.RDB$RELATION_NAME)
  and not exists (
    select * from RDB$RELATION_FIELDS fields
    where (fields.RDB$RELATION_NAME = tables.RDB$RELATION_NAME)
    and (fields.RDB$FIELD_NAME = 'OWNER'))
order by tables.RDB$RELATION_NAME;

這很好。

然后,創建一個proc進行維護:

CREATE PROCEDURE PREPARE_OWNERSHIP
AS 
declare variable name varchar(31); 
BEGIN
   for select NAME from OWNABLE_TABLES_V into :name do
   BEGIN
      execute statement replace('ALTER TABLE %T ADD OWNER INTEGER', '%T', :name)
        with autonomous transaction;
      execute statement replace('ALTER TABLE %T ADD OWNER_TIMEOUT TIMESTAMP', '%T', :name)
        with autonomous transaction;
      execute statement replace('ALTER TABLE %T ADD CONSTRAINT FK_%T_OWNER foreign key (OWNER) references USERS', '%T', :name)
        with autonomous transaction;
   END
END

但是當我運行此程序時,什么也沒發生。 沒有錯誤的報告,但沒有表格更新與新的簿記。 當我在Firebird的Hopper proc調試器下運行proc時,再次沒有得到任何錯誤。

知道發生了什么問題以及如何正確執行此操作嗎?

我發現了問題。 嘗試將其作為EXECUTE BLOCK語句運行后,實際上收到了一條有用的錯誤消息:“未知令牌:_OWNER”。

顯然,在Hopper調試器下運行proc時,這不會顯示,但是包含表名的元數據選擇結果帶有尾隨空格。 所以下面這行:

replace('ALTER TABLE %T ADD CONSTRAINT FK_%T_OWNER foreign key (OWNER) references USERS', '%T', :name)

解決如下問題:

ALTER TABLE TABLENAME ADD CONSTRAINT FK_TABLENAME      _OWNER foreign key (OWNER) references USERS

這顯然是無效的。 添加行name = trim(name); for循環中的BEGIN之后立即將其修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM