Кратки съвети за database

Тук може да намерите полезни съвети и примери за много ситуации.

 

В MSSQL count(col) не работи с всеки тип данни

В MSSQL заявки от вида

select count(col1) from table1

са грешни ако колоната е от тип uniqueidentifier, text, image, ntext. Също не са позволени агрегатни функции и подзаявки.


Таблицата dual в Oracle или как да мигрираме Mysql заявки без таблици

Ако сте запознати с Mysql сигурно се е случвало да използвате заявки без таблици от типа на:
 
SELECT 12 * (1 + 10);

 
Но когато мигрирате подобни заявки към Oracle, откривате, че те не са позволени. Решението е да се използва специалната таблица dual:
 
SELECT 12 * (1 + 10) from dual
 
Таблицат dual се създава автоматично. Тя е съставена от една единствена колона dummy. Има само един ред със стойност 'X'. Накратко - доста полезна за такива случаи.

Забрана за промяна на данните в таблица в Oracle (таблица само за четене)


Удобен начин за предотвратяване на промяна на данните (update, delete, insert) в дадена таблица е да се създаде тригер, който винаги генерира грешка:
 
create or replace no_dml
before insert or update or delete
on my_table
begin
    raise_application_error (-20000, 'my_table is read-only!');
end;

По този начин може да се определят и вида на операциите, които икаме да забраним. Например таблица, в която се вмъкват редове, без възможност за промяна на данните.

 


Изследване на ограниченията (constraints) на Oracle по дадено име


Когато се създава таблица в Oracle с наложени ограничения (constraints), например primary key, unique, foreign key, е добре да се именуват, за да може в последствие да се идентифицират по-лесно при грешки. Но какво става ако това не е направено? Получават се подобни грешки:
 
ORA-00001: unique constraint (MYUSER.SYS_C00009843) violated
 
В такъв случай, за да се идентифицират колоните, таблицата и типа на ограничението (constraint), пуснете следната заявка:
 
select cons.table_name, cons.constraint_name, cons.constraint_type,
    cols.table_name, cols.column_name, cols.position
from user_constraints cons 
    inner join user_cons_columns cols 
        on cons.owner = cols.owner and cons.constraint_name = cols.constraint_name 
where cons.constraint_name = 'SYS_C00009843'