Tôi chỉ sẽ nói rằng điều này là thô lỗ trước khi tôi bắt đầu. Nếu bạn đang tạo các tập lệnh để tự động tạo cơ sở dữ liệu, tôi sẽ bỏ truy vấn bên dưới và chỉ cần sao chép / dán vì điều này quá khủng khiếp, nó KHÔNG thuộc về các tập lệnh triển khai cơ sở dữ liệu của bạn.
Truy vấn
DECLARE
CURSOR TABLES IS SELECT * FROM USER_TABLES
WHERE 0 = (SELECT COUNT(*)
FROM USER_CONSTRAINTS
WHERE USER_CONSTRAINTS.TABLE_NAME = USER_TABLES.TABLE_NAME
AND USER_CONSTRAINTS.CONSTRAINT_TYPE = 'P'
);
BEGIN
FOR T IN TABLES LOOP
EXECUTE IMMEDIATE 'ALTER TABLE '||T.TABLE_NAME||' ADD ID NUMBER(12)';
EXECUTE IMMEDIATE 'CREATE SEQUENCE '||T.TABLE_NAME||'Seq START WITH 1';
EXECUTE IMMEDIATE 'UPDATE '||T.TABLE_NAME||' SET ID = '||T.TABLE_NAME||'Seq.NEXTVAL';
EXECUTE IMMEDIATE 'ALTER TABLE '||T.TABLE_NAME||' ADD PRIMARY KEY (ID)';
EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER '||T.TABLE_NAME||'PKSet '||CHR(10)
||'BEFORE INSERT ON '||T.TABLE_NAME||' '||CHR(10)
||'FOR EACH ROW '||CHR(10)
||'BEGIN '||CHR(10)
||':NEW.ID := '||T.TABLE_NAME||'Seq.NEXTVAL; '||CHR(10)
||'END; ';
END LOOP;
END;
/
Điều này có tác dụng gì?
Về cơ bản, nó nhận một danh sách các bảng và tự động xây dựng SQL để thực hiện các tác vụ khác nhau liên quan. EXECUTE IMMEDIATE
lấy chuỗi nơi chúng ta đã xây dựng SQL và thực thi nó. CHR(10)
sự bẩn thỉu là một dòng mới. Tôi muốn có khoảng trắng trong đó vì tôi không biết việc bỏ nó ra ngoài sẽ ảnh hưởng đến việc phân tích cú pháp của Oracle như thế nào. Lưu ý rằng ở một số nơi, chúng tôi nối trực tiếp tên bảng với một số văn bản khác để tạo ra một chuỗi hoặc tên ràng buộc PK.
Điều này có thể xảy ra hoặc có thể không xảy ra nếu bạn đã trích dẫn tên bảng của mình trong quá trình tạo và sử dụng một số ký tự viết thường. Nếu nó KHÔNG xảy ra lỗi, hãy nhớ rằng mọi câu lệnh đều liên quan đến một cam kết. Một lỗi sẽ có nghĩa là quá trình đã hoàn thành một nửa. Nó cũng không thành công nếu lược đồ không phải là người dùng hiện tại. (Bạn sẽ cần thay đổi USER_TABLES
thành ALL_TABLES
và thêm một bộ lọc thích hợp trong mệnh đề where và thêm lược đồ vào trước tên bảng khi xây dựng SQL để làm cho nó hoạt động trên một lược đồ khác.)
SQLFiddle hoạt động thực tế: http://sqlfiddle.com/#!4/b67fc/1 (Tôi không thể tin rằng điều này thực sự hoạt động trên SQLFiddle.) Trong trường hợp này, truy vấn mà chúng tôi quan tâm đã kết thúc trong định nghĩa lược đồ vì SQL Fiddle chỉ cho phép SELECT
trong truy vấn.
Chúc may mắn. Bạn sẽ cần đến nó. Đừng tự bắn vào chân mình.