Linux MySQL(六)儲存過程觸發器使用者管理

2021-09-11 06:26:31 字數 4242 閱讀 4846

儲存過程與自定義函式的區別

delimiter //

create procedure showtime()

begin

select now();

end//

delimiter ;

call showtime;

delimiter //

create procedure selectbyid(in uid smallint unsigned)

begin

select * from students where stuid = uid;

end//

delimiter ;

call selectbyid(2);

查詢編號為2的學生

##儲存過程示例

delimiter //

create procedure dorepeat(n int)

begin

set @i = 0;

set @sum = 0;

repeat set @sum = @sum+@i; set @i = @i + 1;

until @i > n end repeat;

end//

delimiter ;

call dorepeat(100);

select @sum;

建立含參儲存過程:包含in引數和out引數

delimiter //

create procedure deletebyid(in uid smallint unsigned, out num smallint unsigned)

begin

delete from students where stuid = uid;

select row_count() into num;

end//

delimiter ;

call deletebyid(2,@line);

select @line;

說明:建立儲存過程deletebyid,包含乙個in引數和乙個out引數.呼叫時,傳入刪除的id和儲存被修改的行數值的使用者變數@line,select @line;輸出被影響行數

準備工作:

create table student_info (

stu_id int(11) not null auto_increment,

stu_name varchar(255) default null,

primary key (stu_id)

);create table student_count (

student_count int(11) default 0

);insert into student_count values(0);

示例:建立觸發器,在向學生表insert資料時,學生數增加,delete學生時,學生數減少

create trigger trigger_student_count_insert

after insert

on student_info for each row

update student_count set student_count=student_count+1;

create trigger trigger_student_count_delete

after delete

on student_info for each row

update student_count set student_count=student_count-1;

mysql> use information_schema;

database changed

mysql>

select

* from

triggers

where

trigger_name='trigger_student_count_insert';

create 

user dushan@'192.168.31.17'

identified by

'centos';

rename user 

liuying@'192.168.31.17'

to dushan@'192.168.32.17';

在192.168.32.17上測試:

mysql -udushan -pcentos -h192.168.32.7

drop user test@'192.168.31.17';
drop user ''@'localhost';
set password for 

dushan@'192.168.32.17'=password('123456');

還可以用下列方法修改,*不推薦*

update

mysql.user

set

password=password('password')

where

clause;

此方法需要執行下面指令才能生效:

flush privileges;

客戶端驗證:

mysqladmin -u root -poldpass password 『newpass』

測試中可直接刪除mysql中的表....當然沒有什麼意義

systemctl stop mariadb

rm -rf /var/lib/mysql/*

劃重點啟動mysqld程序時,為其使用如下選項:

–skip-grant-tables --skip-networking

update 命令修改

關閉mysqld程序,移除上述兩個選項,重啟mysqld

systemctl stop mariadb

vim /etc/my.cnf

[mysqld]

skip-grant-tables mysqld語句塊底下新增

skip-networking

systemctl start mariadb

進入後update mysql.user set password=''

多例項情況下,啟動指令碼中新增–skip-grant-tables即可

許可權類別:

管理類程式類

資料庫級別

表級別字段級別

參考:

示例:grant select (col1), insert (col1,col2) on mydb.mytbl to 『someuser』@'somehost『;

grant select(stuid,name) on hellodb.students to liuying@'192.168.32.17';

192.168.32.17的liuying只能查詢students表中的stuid和name欄位

grant all on * to liuying@'192.168.32.17';

對所有表授權,*代表當前庫所有表,不代表所有庫

show grants for liuying@'192.168.32.17'\g;

revoke all on *.* from liuying@'192.168.32.17';

revoke delete on hellbd.* from 'liuying'@'192.168.32.17';

注意:mariadb服務程序啟動時會讀取mysql庫中所有授權表至記憶體

(1) grant或revoke等執行許可權操作會儲存於系統表中,mariadb的服務程序通常會自動重讀授權表,使之生效

(2) 對於不能夠或不能及時重讀授權表的命令,可手動讓mariadb的服務程序重讀授權表:mysql> flush privileges;

linux mysql 批量儲存

當mysql引擎為innodb時,mysql支援提交模式的設定,預設是自動提交的,通過設定提交模式為關閉,最後統一提交,我們可以提 高批量儲存資料的效率,下面是例項 mysql mysql mysql init mysql if mysql real connect mysql,host user ...

六 MySQL儲存過程

在資料庫系統中為了保證資料的完整性和一致性,同時也為了提高其應用效能,大多數的資料庫常採用儲存過程和儲存函式技術 類似於c語言中的函式 mysql5.0以後開始支援儲存過程和儲存函式。1 建立儲存過程 create procedure sp name proc parameter character...

MYSQL儲存過程(六)

1 mysql執行流程,通過儲存過程,可以避免重複語法分和編譯,提高執行效率 2 儲存過程 1 是sql語句與控制語句的 預編譯集合 以 乙個名稱儲存 作為 乙個單元處理 2 優點 增強了語句的功能和靈活性 可以通過控制語句對流程進行控制和判斷 實現較快的執行速度,只在 第一次呼叫時進行語法分析和編...