![](/img/trans.png)
[英]How do I create an index from a stored procedure or create index on every table in MySQL?
[英]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.