<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>LXF78:PHP - История изменений</title>
		<link>http://wiki2.linuxformat.ru/index.php?title=LXF78:PHP&amp;action=history</link>
		<description>История изменений этой страницы в вики</description>
		<language>ru</language>
		<generator>MediaWiki 1.11.1</generator>
		<lastBuildDate>Thu, 14 May 2026 04:16:17 GMT</lastBuildDate>
		<item>
			<title>Yaleks: шаблон</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF78:PHP&amp;diff=4928&amp;oldid=prev</link>
			<description>&lt;p&gt;шаблон&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;tr&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 09:36, 30 июня 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Цикл/PHP}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;== PHP Представления ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;''Часть 3. Живите легко! Сократите объемы SQL-кода и повысьте производительность. '''Пол Хадсон''' представляет себе последствия...''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;''Часть 3. Живите легко! Сократите объемы SQL-кода и повысьте производительность. '''Пол Хадсон''' представляет себе последствия...''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Mon, 30 Jun 2008 09:36:33 GMT</pubDate>			<dc:creator>Yaleks</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF78:PHP</comments>		</item>
		<item>
			<title>Yaleks: «LXF78:Учебник PHP: MySQL 5.0 Special» переименована в «LXF78:PHP»: унификация</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF78:PHP&amp;diff=4923&amp;oldid=prev</link>
			<description>&lt;p&gt;«&lt;a href=&quot;/index.php/LXF78:%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA_PHP:_MySQL_5.0_Special&quot; title=&quot;LXF78:Учебник PHP: MySQL 5.0 Special&quot;&gt;LXF78:Учебник PHP: MySQL 5.0 Special»&lt;/a&gt; переименована в «&lt;a href=&quot;/index.php/LXF78:PHP&quot; title=&quot;LXF78:PHP&quot;&gt;LXF78:PHP»&lt;/a&gt;: унификация&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;tr&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 09:18, 30 июня 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;/table&gt;</description>
			<pubDate>Mon, 30 Jun 2008 09:18:56 GMT</pubDate>			<dc:creator>Yaleks</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF78:PHP</comments>		</item>
		<item>
			<title>Lockal: восстановление кавычек в коде  AWB</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF78:PHP&amp;diff=4450&amp;oldid=prev</link>
			<description>&lt;p&gt;восстановление кавычек в коде  &lt;a href=&quot;/index.php?title=Linuxformat:AutoWikiBrowser&amp;amp;action=edit&quot; class=&quot;new&quot; title=&quot;Linuxformat:AutoWikiBrowser&quot;&gt;AWB&lt;/a&gt;&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;tr&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 13:19, 27 апреля 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 15:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 15:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; IBAN VARCHAR(100));&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; IBAN VARCHAR(100));&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В базе данных хранится имя и возраст человека (вполне безобидная информация), номер социального страхования (SSN) и International Bank Account Number (IBAN) – определенно приватные данные. Мы хотим, чтобы другие сотрудники видели только имя и возраст. Отделу кадров понадобится и SSN, а бухгалтерии – еще и IBAN. Чтобы сделать это, нам потребуются три представления (view): &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;‘restricted’ &lt;/del&gt;(ограниченный), &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;‘HR’ &lt;/del&gt;(отдел кадров) и &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;‘accounts’ &lt;/del&gt;(бухгалтерия).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В базе данных хранится имя и возраст человека (вполне безобидная информация), номер социального страхования (SSN) и International Bank Account Number (IBAN) – определенно приватные данные. Мы хотим, чтобы другие сотрудники видели только имя и возраст. Отделу кадров понадобится и SSN, а бухгалтерии – еще и IBAN. Чтобы сделать это, нам потребуются три представления (view): &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'restricted' &lt;/ins&gt;(ограниченный), &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'HR' &lt;/ins&gt;(отдел кадров) и &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'accounts' &lt;/ins&gt;(бухгалтерия).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Представления создаются при помощи оператора '''CREATE VIEW''', за которым следует стандартный запрос '''SELECT''':&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Представления создаются при помощи оператора '''CREATE VIEW''', за которым следует стандартный запрос '''SELECT''':&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 37:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 37:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;MySQL весьма гибок в отношении пользовательских прав на доступ к таблицам. Эта же гибкость сохраняется и для представлений, а значит, мы можем позволить людям читать только одно представление, или же читать одно, а писать – другое. Прежде всего, нам потребуется пользовательская учетная запись, так что подключитесь к MySQL как root и наберите:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;MySQL весьма гибок в отношении пользовательских прав на доступ к таблицам. Эта же гибкость сохраняется и для представлений, а значит, мы можем позволить людям читать только одно представление, или же читать одно, а писать – другое. Прежде всего, нам потребуется пользовательская учетная запись, так что подключитесь к MySQL как root и наберите:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; USE MySQL&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; USE MySQL&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; INSERT INTO user (Host, User, Password, ssl_cipher, x509_issuer, x509_subject) VALUES (&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;‘localhost’&lt;/del&gt;, &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;‘peon’&lt;/del&gt;,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; INSERT INTO user (Host, User, Password, ssl_cipher, x509_issuer, x509_subject) VALUES (&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'localhost'&lt;/ins&gt;, &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'peon'&lt;/ins&gt;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; PASSWORD(&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;‘p30n’&lt;/del&gt;), &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;‘’&lt;/del&gt;, &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;‘’&lt;/del&gt;, &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;‘’&lt;/del&gt;);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; PASSWORD(&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'p30n'&lt;/ins&gt;), &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;''&lt;/ins&gt;, &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;''&lt;/ins&gt;, &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;''&lt;/ins&gt;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В зависимости от версии MySQL и режима работы (strict или не-strict), вам может потребоваться поиграть с '''ssl_cipher'''. В любом случае, теперь у нас есть новый пользователь, которому нужно предоставить право на чтение представления:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В зависимости от версии MySQL и режима работы (strict или не-strict), вам может потребоваться поиграть с '''ssl_cipher'''. В любом случае, теперь у нас есть новый пользователь, которому нужно предоставить право на чтение представления:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 45:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 45:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; FLUSH PRIVILEGES;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; FLUSH PRIVILEGES;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В итоге пользователь peon получит доступ только к таблице или представлению &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;‘restricted’ &lt;/del&gt;в БД your_db_name. Теперь отсоединитесь от MySQL и вновь зайдите как новый пользователь. Попробуйте выполнить следующее:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В итоге пользователь peon получит доступ только к таблице или представлению &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'restricted' &lt;/ins&gt;в БД your_db_name. Теперь отсоединитесь от MySQL и вновь зайдите как новый пользователь. Попробуйте выполнить следующее:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; SELECT * FROM employees;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; SELECT * FROM employees;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Вы получите сообщение об ошибке: «SELECT command denied to user &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;‘peon’&lt;/del&gt;@&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;’localhost’ &lt;/del&gt;for table &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;‘employees’»&lt;/del&gt;. На самом деле, выполнив '''SHOW TABLES''', вы увидите только представление &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;‘restricted’ &lt;/del&gt;– MySQL делает вид, что никакой таблицы employees не существует. Чтобы предоставить пользователю peon чуть больше прав, опять зайдите как root и выполните:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Вы получите сообщение об ошибке: «SELECT command denied to user &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'peon'&lt;/ins&gt;@&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'localhost' &lt;/ins&gt;for table &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'employees'»&lt;/ins&gt;. На самом деле, выполнив '''SHOW TABLES''', вы увидите только представление &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'restricted' &lt;/ins&gt;– MySQL делает вид, что никакой таблицы employees не существует. Чтобы предоставить пользователю peon чуть больше прав, опять зайдите как root и выполните:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; GRANT SELECT,INSERT,DELETE,UPDATE ON test.restricted TO peon@localhost;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; GRANT SELECT,INSERT,DELETE,UPDATE ON test.restricted TO peon@localhost;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; FLUSH PRIVILEGES;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; FLUSH PRIVILEGES;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Sun, 27 Apr 2008 13:19:09 GMT</pubDate>			<dc:creator>Lockal</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF78:PHP</comments>		</item>
		<item>
			<title>Seafox в 15:09, 22 марта 2008</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF78:PHP&amp;diff=3216&amp;oldid=prev</link>
			<description>&lt;p&gt;&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;tr&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 15:09, 22 марта 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 98:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 98:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;...Советы&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;...Советы&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;• &lt;/del&gt;Если какие-то поля в вашей таблице вычисляются триггером, зачем позволять пользователю устанавливать их значения напрямую? Создайте представления, исключите их из него и пусть триггер делает свое дело.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* &lt;/ins&gt;Если какие-то поля в вашей таблице вычисляются триггером, зачем позволять пользователю устанавливать их значения напрямую? Создайте представления, исключите их из него и пусть триггер делает свое дело.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;• &lt;/del&gt;Кстати о триггерах – вы не можете использовать их с представлениями, поскольку в них на самом деле не хранятся данные. Устанавливайте триггер на родительскую таблицу.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* &lt;/ins&gt;Кстати о триггерах – вы не можете использовать их с представлениями, поскольку в них на самом деле не хранятся данные. Устанавливайте триггер на родительскую таблицу.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;• &lt;/del&gt;И таблицы, и представления принадлежат базе данных, а значит, вы не можете давать им одинаковые имена.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* &lt;/ins&gt;И таблицы, и представления принадлежат базе данных, а значит, вы не можете давать им одинаковые имена.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;• &lt;/del&gt;Чтобы изменить запрос, соответствующий представлению, наберите ту же конструкцию, что и для его создания, но замените CREATE VIEW на CREATE OR REPLACE VIEW.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* &lt;/ins&gt;Чтобы изменить запрос, соответствующий представлению, наберите ту же конструкцию, что и для его создания, но замените CREATE VIEW на CREATE OR REPLACE VIEW.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;• &lt;/del&gt;Чтобы удалить представление, наберите: DROP VIEW your_view_name;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;* &lt;/ins&gt;Чтобы удалить представление, наберите: DROP VIEW your_view_name;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Sat, 22 Mar 2008 15:09:01 GMT</pubDate>			<dc:creator>Seafox</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF78:PHP</comments>		</item>
		<item>
			<title>Seafox в 15:07, 22 марта 2008</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF78:PHP&amp;diff=3215&amp;oldid=prev</link>
			<description>&lt;p&gt;&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;tr&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 15:07, 22 марта 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 94:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 94:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Таким образом, представления сокращают время разработки, создают меньше ошибок, добавляют гибкости и помогают убираться по воскресеньям. Ну, насчет уборки я, конечно, загнул, но согласитесь: представления – это круто, и нужно быть сумасшедшим, чтобы не&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Таким образом, представления сокращают время разработки, создают меньше ошибок, добавляют гибкости и помогают убираться по воскресеньям. Ну, насчет уборки я, конечно, загнул, но согласитесь: представления – это круто, и нужно быть сумасшедшим, чтобы не&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;использовать их в своей работе.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;использовать их в своей работе.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;----&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;...Советы&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;• Если какие-то поля в вашей таблице вычисляются триггером, зачем позволять пользователю устанавливать их значения напрямую? Создайте представления, исключите их из него и пусть триггер делает свое дело.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;• Кстати о триггерах – вы не можете использовать их с представлениями, поскольку в них на самом деле не хранятся данные. Устанавливайте триггер на родительскую таблицу.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;• И таблицы, и представления принадлежат базе данных, а значит, вы не можете давать им одинаковые имена.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;• Чтобы изменить запрос, соответствующий представлению, наберите ту же конструкцию, что и для его создания, но замените CREATE VIEW на CREATE OR REPLACE VIEW.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;• Чтобы удалить представление, наберите: DROP VIEW your_view_name;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Sat, 22 Mar 2008 15:07:40 GMT</pubDate>			<dc:creator>Seafox</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF78:PHP</comments>		</item>
		<item>
			<title>Seafox в 15:04, 22 марта 2008</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF78:PHP&amp;diff=3214&amp;oldid=prev</link>
			<description>&lt;p&gt;&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;tr&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 15:04, 22 марта 2008&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Часть 3 Живите легко! Сократите объемы SQL-кода и повысьте производительность. Пол Хадсон представляет себе последствия...&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;''&lt;/ins&gt;Часть 3&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;. &lt;/ins&gt;Живите легко! Сократите объемы SQL-кода и повысьте производительность. &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;Пол Хадсон&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;''' &lt;/ins&gt;представляет себе последствия...&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;''&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Хотя структура вашей БД, скорее всего, меняется не каждые пять минут, существует множество способов подать одни и те же данные. В сложной системе доступ ко всей базе данных (и записи в нее) может быть предоставлен только администратору. Простым смертным приходится довольствоваться лишь чтением какой-либо таблицы или даже ее части.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Хотя структура вашей БД, скорее всего, меняется не каждые пять минут, существует множество способов подать одни и те же данные. В сложной системе доступ ко всей базе данных (и записи в нее) может быть предоставлен только администратору. Простым смертным приходится довольствоваться лишь чтением какой-либо таблицы или даже ее части.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 17:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 17:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В базе данных хранится имя и возраст человека (вполне безобидная информация), номер социального страхования (SSN) и International Bank Account Number (IBAN) – определенно приватные данные. Мы хотим, чтобы другие сотрудники видели только имя и возраст. Отделу кадров понадобится и SSN, а бухгалтерии – еще и IBAN. Чтобы сделать это, нам потребуются три представления (view): ‘restricted’ (ограниченный), ‘HR’ (отдел кадров) и ‘accounts’ (бухгалтерия).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В базе данных хранится имя и возраст человека (вполне безобидная информация), номер социального страхования (SSN) и International Bank Account Number (IBAN) – определенно приватные данные. Мы хотим, чтобы другие сотрудники видели только имя и возраст. Отделу кадров понадобится и SSN, а бухгалтерии – еще и IBAN. Чтобы сделать это, нам потребуются три представления (view): ‘restricted’ (ограниченный), ‘HR’ (отдел кадров) и ‘accounts’ (бухгалтерия).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Представления создаются при помощи оператора CREATE VIEW, за которым следует стандартный запрос SELECT:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Представления создаются при помощи оператора &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;CREATE VIEW&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;, за которым следует стандартный запрос &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;SELECT&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; CREATE VIEW restricted AS SELECT FirstName, LastName,&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; CREATE VIEW restricted AS SELECT FirstName, LastName,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; Age FROM employees;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; Age FROM employees;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Представления выглядят как виртуальные таблицы: они не занимаются реальным копированием данных из employees и не появляются в выводе команды SHOW TABLES. Чтобы увидеть представления, необходимо выполнить SHOW FULL TABLES. Ее вывод будет разделен на две колонки. Строка BASE TABLE обозначает стандартную таблицу MySQL, VIEW соответствует представлению.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Представления выглядят как виртуальные таблицы: они не занимаются реальным копированием данных из employees и не появляются в выводе команды &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;SHOW TABLES&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;. Чтобы увидеть представления, необходимо выполнить &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;SHOW FULL TABLES&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;. Ее вывод будет разделен на две колонки. Строка &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;BASE TABLE&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;''' &lt;/ins&gt;обозначает стандартную таблицу MySQL, &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;VIEW&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;''' &lt;/ins&gt;соответствует представлению.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Однако в смысле выполнения запросов представления ведут себя как самые обычные таблицы. Например, чтобы прочитать все строки таблицы employees от имени «ограниченного» пользователя, выполните: SELECT * FROM restricted;. Вы также можете добавить некоторые условия, например:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Однако в смысле выполнения запросов представления ведут себя как самые обычные таблицы. Например, чтобы прочитать все строки таблицы employees от имени «ограниченного» пользователя, выполните: &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;SELECT * FROM restricted;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;. Вы также можете добавить некоторые условия, например:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; SELECT * FROM restricted WHERE Age &amp;gt; 40;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; SELECT * FROM restricted WHERE Age &amp;gt; 40;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 40:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 40:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; PASSWORD(‘p30n’), ‘’, ‘’, ‘’);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; PASSWORD(‘p30n’), ‘’, ‘’, ‘’);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В зависимости от версии MySQL и режима работы (strict или не-strict), вам может потребоваться поиграть с ssl_cipher. В любом случае, теперь у нас есть новый пользователь, которому нужно предоставить право на чтение представления:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;В зависимости от версии MySQL и режима работы (strict или не-strict), вам может потребоваться поиграть с &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;ssl_cipher&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;. В любом случае, теперь у нас есть новый пользователь, которому нужно предоставить право на чтение представления:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; GRANT SELECT ON your_db_name.restricted TO peon@localhost;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; GRANT SELECT ON your_db_name.restricted TO peon@localhost;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 49:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 49:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; SELECT * FROM employees;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; SELECT * FROM employees;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Вы получите сообщение об ошибке: «SELECT command denied to user ‘peon’@’localhost’ for table ‘employees’». На самом деле, выполнив SHOW TABLES, вы увидите только представление ‘restricted’ – MySQL делает вид, что никакой таблицы employees не существует. Чтобы предоставить пользователю peon чуть больше прав, опять зайдите как root и выполните:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Вы получите сообщение об ошибке: «SELECT command denied to user ‘peon’@’localhost’ for table ‘employees’». На самом деле, выполнив &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;SHOW TABLES&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;, вы увидите только представление ‘restricted’ – MySQL делает вид, что никакой таблицы employees не существует. Чтобы предоставить пользователю peon чуть больше прав, опять зайдите как root и выполните:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; GRANT SELECT,INSERT,DELETE,UPDATE ON test.restricted TO peon@localhost;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; GRANT SELECT,INSERT,DELETE,UPDATE ON test.restricted TO peon@localhost;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; FLUSH PRIVILEGES;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt; FLUSH PRIVILEGES;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 84:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 84:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;  GROUP BY page_requests.UserID;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;  GROUP BY page_requests.UserID;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Это даст нам всю информацию о человеке, включая число посещенных страниц. Правда, запрос получился не такой уж короткий, и многие наверняка споткнутся, дойдя до LEFT JOIN. Используя представления, вы можете сократить его до SELECT * FROM employees_complete и  забыть об этих проблемах.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Это даст нам всю информацию о человеке, включая число посещенных страниц. Правда, запрос получился не такой уж короткий, и многие наверняка споткнутся, дойдя до &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;LEFT JOIN&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;. Используя представления, вы можете сократить его до &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;'''&lt;/ins&gt;SELECT * FROM employees_complete&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;''' &lt;/ins&gt;и  забыть об этих проблемах.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Все, что мы видели до сих пор, позволяет сократить время разработки и снизить число ошибок в коде, однако, представления обладают еще двумя преимуществами: во-первых, они позволяют создать одну большую «супертаблицу» и подпредставления (subview), которые выбирают данные из обширного источника. Во-вторых, представления – это, по сути, функции, которые можно изменить в любое время.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Все, что мы видели до сих пор, позволяет сократить время разработки и снизить число ошибок в коде, однако, представления обладают еще двумя преимуществами: во-первых, они позволяют создать одну большую «супертаблицу» и подпредставления (subview), которые выбирают данные из обширного источника. Во-вторых, представления – это, по сути, функции, которые можно изменить в любое время.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Sat, 22 Mar 2008 15:04:57 GMT</pubDate>			<dc:creator>Seafox</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF78:PHP</comments>		</item>
		<item>
			<title>Seafox: Новая: Часть 3 Живите легко! Сократите объемы SQL-кода и повысьте производительность. Пол Хадсон представляет ...</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF78:PHP&amp;diff=3210&amp;oldid=prev</link>
			<description>&lt;p&gt;Новая: Часть 3 Живите легко! Сократите объемы SQL-кода и повысьте производительность. Пол Хадсон представляет ...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Часть 3 Живите легко! Сократите объемы SQL-кода и повысьте производительность. Пол Хадсон представляет себе последствия...&lt;br /&gt;
&lt;br /&gt;
Хотя структура вашей БД, скорее всего, меняется не каждые пять минут, существует множество способов подать одни и те же данные. В сложной системе доступ ко всей базе данных (и записи в нее) может быть предоставлен только администратору. Простым смертным приходится довольствоваться лишь чтением какой-либо таблицы или даже ее части.&lt;br /&gt;
&lt;br /&gt;
Если вы не можете найти реальный пример, подумайте об отделе кадров. Его сотрудники должны легко находить ваше имя, должность и так далее. Но ваш домашний телефон или реквизиты банковского счета – это не их дело. Такая информация является личной, и доступ к ней предоставляется только старшему персоналу. Можно также представить себе еще один уровень доступа, которым обладают все сотрудники компании, позволяющий, например, узнать имя, должность и внутренний номер телефона.&lt;br /&gt;
&lt;br /&gt;
Так что, даже если в вашей таблице всего одна строка данных, вы имеете три разных способа их подачи: полный доступ, ограниченный доступ и малый доступ. MySQL 5.0 предоставляет средства для программирования этих разграничений в самой базе данных, так что каждый пользователь будет иметь доступ лишь к одному представлению.&lt;br /&gt;
&lt;br /&gt;
*Представление начинается&lt;br /&gt;
&lt;br /&gt;
Думайте о представлении как о фиксированном SQL-запросе, который определяет, что может увидеть пользователь в таблице. В этом учебнике мы будем работать с таблицей employees (сотрудники): &lt;br /&gt;
 CREATE TABLE employees (ID INT NOT NULL AUTO_&lt;br /&gt;
 INCREMENT PRIMARY KEY, FirstName VARCHAR(100),&lt;br /&gt;
 LastName VARCHAR(100), Age INT, SSN VARCHAR(30),&lt;br /&gt;
 IBAN VARCHAR(100));&lt;br /&gt;
&lt;br /&gt;
В базе данных хранится имя и возраст человека (вполне безобидная информация), номер социального страхования (SSN) и International Bank Account Number (IBAN) – определенно приватные данные. Мы хотим, чтобы другие сотрудники видели только имя и возраст. Отделу кадров понадобится и SSN, а бухгалтерии – еще и IBAN. Чтобы сделать это, нам потребуются три представления (view): ‘restricted’ (ограниченный), ‘HR’ (отдел кадров) и ‘accounts’ (бухгалтерия).&lt;br /&gt;
&lt;br /&gt;
Представления создаются при помощи оператора CREATE VIEW, за которым следует стандартный запрос SELECT:&lt;br /&gt;
 CREATE VIEW restricted AS SELECT FirstName, LastName,&lt;br /&gt;
 Age FROM employees;&lt;br /&gt;
&lt;br /&gt;
Представления выглядят как виртуальные таблицы: они не занимаются реальным копированием данных из employees и не появляются в выводе команды SHOW TABLES. Чтобы увидеть представления, необходимо выполнить SHOW FULL TABLES. Ее вывод будет разделен на две колонки. Строка BASE TABLE обозначает стандартную таблицу MySQL, VIEW соответствует представлению.&lt;br /&gt;
&lt;br /&gt;
Однако в смысле выполнения запросов представления ведут себя как самые обычные таблицы. Например, чтобы прочитать все строки таблицы employees от имени «ограниченного» пользователя, выполните: SELECT * FROM restricted;. Вы также можете добавить некоторые условия, например:&lt;br /&gt;
&lt;br /&gt;
 SELECT * FROM restricted WHERE Age &amp;gt; 40;&lt;br /&gt;
 SELECT * FROM restricted LIMIT 3;&lt;br /&gt;
 SELECT MAX(Age) FROM restricted;&lt;br /&gt;
&lt;br /&gt;
Последняя строка представляет особенный интерес, поскольку в ней мы «фильтруем фильтр»: представление restricted является подмножеством employees, а мы выделяем из него одну-единственную колонку. По сути, это эквивалентно:&lt;br /&gt;
 SELECT MAX(Age) FROM (SELECT * FROM employees);&lt;br /&gt;
&lt;br /&gt;
Но что мешает пользователю прочитать данные из employees, а не из restricted? Пока – ничего. Пока...&lt;br /&gt;
&lt;br /&gt;
*Ограниченное представление&lt;br /&gt;
MySQL весьма гибок в отношении пользовательских прав на доступ к таблицам. Эта же гибкость сохраняется и для представлений, а значит, мы можем позволить людям читать только одно представление, или же читать одно, а писать – другое. Прежде всего, нам потребуется пользовательская учетная запись, так что подключитесь к MySQL как root и наберите:&lt;br /&gt;
 USE MySQL&lt;br /&gt;
 INSERT INTO user (Host, User, Password, ssl_cipher, x509_issuer, x509_subject) VALUES (‘localhost’, ‘peon’,&lt;br /&gt;
 PASSWORD(‘p30n’), ‘’, ‘’, ‘’);&lt;br /&gt;
&lt;br /&gt;
В зависимости от версии MySQL и режима работы (strict или не-strict), вам может потребоваться поиграть с ssl_cipher. В любом случае, теперь у нас есть новый пользователь, которому нужно предоставить право на чтение представления:&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT ON your_db_name.restricted TO peon@localhost;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
В итоге пользователь peon получит доступ только к таблице или представлению ‘restricted’ в БД your_db_name. Теперь отсоединитесь от MySQL и вновь зайдите как новый пользователь. Попробуйте выполнить следующее:&lt;br /&gt;
&lt;br /&gt;
 SELECT * FROM employees;&lt;br /&gt;
&lt;br /&gt;
Вы получите сообщение об ошибке: «SELECT command denied to user ‘peon’@’localhost’ for table ‘employees’». На самом деле, выполнив SHOW TABLES, вы увидите только представление ‘restricted’ – MySQL делает вид, что никакой таблицы employees не существует. Чтобы предоставить пользователю peon чуть больше прав, опять зайдите как root и выполните:&lt;br /&gt;
 GRANT SELECT,INSERT,DELETE,UPDATE ON test.restricted TO peon@localhost;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
Это позволит пользователю манипулировать данными таблицы, не боясь навредить ей самой.&lt;br /&gt;
Производные Производные колонки (derived columns) позволяют хранить в вашем  представлении синтетические данные. Обычная колонка просто читает значение поля таблицы и помещает его в представление, тогда как производная колонка читает некоторое поле, выполняет преобразование и лишь затем помещает данные в представление. Умно!&lt;br /&gt;
&lt;br /&gt;
Один из моих любимых принципов БД – атомарность. Я предпочитаю хранить все поля по отдельности, независимо друг от друга, и вычислять нужные величины «на лету» по мере надобности. Например, если меня интересует число страниц, которые пользователь посетил в  местной интранет-сети, я сохраню запись о каждой странице, а также сопутствующую информацию (дату, время, ...) в отдельности, а затем запущу запрос, который посчитает число строк – это и будет количество страниц, посещенных данным пользователем.&lt;br /&gt;
&lt;br /&gt;
Вашему боссу это может не понравиться – ведь он-то хочет видеть в базе данных одно число, а не отдельные запросы! С представлениями и производными колонками мы можем легко синтезировать эти данные и предоставить боссу на блюдечке.&lt;br /&gt;
&lt;br /&gt;
*Вычисляемые колонки&lt;br /&gt;
В качестве иллюстрации, рассмотрим следующую таблицу для несущес-&lt;br /&gt;
твующего файла журнала:&lt;br /&gt;
 CREATE TABLE page_requests (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, UserID INT, PageID INT, RequestTime INT);&lt;br /&gt;
&lt;br /&gt;
После занесения в нее кое-каких данных, можно создать «боссово представление» следующим образом:&lt;br /&gt;
 CREATE VIEW total_requests AS SELECT UserID, Count(*) AS RequestCount FROM page_requests GROUP BY UserID;&lt;br /&gt;
&lt;br /&gt;
Здесь мы создаем производную колонку, основываясь на числе запросов, которые сделал пользователь. Вы не можете обновить ее или удалить какую-либо строку на основе ее данных, поскольку на самом деле это не колонка, а вычисление, которое MySQL производит по ходу работы.&lt;br /&gt;
&lt;br /&gt;
Это – самый распространенный способ использования производных колонок. Например, отдел кадров может не интересовать, когда именно человек был в отпуске, но его сотрудникам важно знать, сколько у него осталось неиспользованных дней. Производные колонки также можно использовать для замещения значений колонки нужными нам величинами. Например, мы использовали представления, чтобы ограничить доступ к SSN и IBAN. Возможно, лучшим решением было бы поместить в этих колонках служебное сообщение, указывающее, к кому следует обратиться за теми или иными сведениями. Вот  соответствующий код:&lt;br /&gt;
 CREATE VIEW restricted_contact AS SELECT FirstName, LastName, Age, «Обратитесь к Иванову из отдела кадров» AS SSN, «Обратитесь к Петрову из бухгалтерии» AS IBAN FROM employees;&lt;br /&gt;
&lt;br /&gt;
*Вид сверху&lt;br /&gt;
&lt;br /&gt;
Представления – прекрасное средство для обеспечения безопасности, но они могут также оказаться полезными при работе со сложными SQL-запросами, оперирующими с несколькими источниками данных. Вся «соль» в том, что пользователь может работать с представлением как с таблицей, свободно выбирая колонки и способ упорядочения данных. Длинные SQL-запросы долго пересылаются, обрабатываются и служат прекрасной почвой для разведения различных ошибок. Представления позволяют инкапсулировать эти сложные запросы в простые конструкции SELECT, которыми пользователь может распоряжаться по своему разумению.&lt;br /&gt;
&lt;br /&gt;
Допустим, у нас есть две таблицы: одна – для сотрудников и вторая – для записей о просмотренных ими страницах. Мы можем объединить их при помощи LEFT JOIN:&lt;br /&gt;
&lt;br /&gt;
 SELECT employees.*, count(page_requests.ID) AS &lt;br /&gt;
    PageRequests FROM employees LEFT JOIN page_requests  &lt;br /&gt;
    ON employees.ID = page_requests.UserID&lt;br /&gt;
  GROUP BY page_requests.UserID;&lt;br /&gt;
&lt;br /&gt;
Это даст нам всю информацию о человеке, включая число посещенных страниц. Правда, запрос получился не такой уж короткий, и многие наверняка споткнутся, дойдя до LEFT JOIN. Используя представления, вы можете сократить его до SELECT * FROM employees_complete и  забыть об этих проблемах.&lt;br /&gt;
&lt;br /&gt;
Все, что мы видели до сих пор, позволяет сократить время разработки и снизить число ошибок в коде, однако, представления обладают еще двумя преимуществами: во-первых, они позволяют создать одну большую «супертаблицу» и подпредставления (subview), которые выбирают данные из обширного источника. Во-вторых, представления – это, по сути, функции, которые можно изменить в любое время.&lt;br /&gt;
&lt;br /&gt;
Как я уже неоднократно говорил, в большинстве случаев представление действует как таблица. Подпредставление – это представление, созданное на базе другого представления. Вы можете создать «супер-представление», которое объединяет четыре таблицы, а затем ввести десяток подпредставлений, которые выбирают некоторые колонки, не заставляя вас писать сложные запросы. Синтаксис определения подпредставления ничем не отличается от создания представления на базе обычной таблицы, так что обойдемся без примера. Следуя моему совету, будьте предельно бдительны: легко создать суперпредставление, работающее значительное время, и подпредставления, которым нужна лишь ничтожная часть его данных. Это очень неэкономный подход к использованию ресурсов, так что создавайте подпредставление только если оно содержит столько же таблиц, что и суперпредставление.&lt;br /&gt;
&lt;br /&gt;
Наконец, если рассматривать представления как функции, вы выходите на совершенно новый уровень контроля доступа к данным. Если для получения необходимой информации используются только представления, вы можете изменить их в любое время и добавить новую колонку или подправить алгоритм. Все пользователи увидят результат нового запроса – без какой-либо правки кода.&lt;br /&gt;
&lt;br /&gt;
Таким образом, представления сокращают время разработки, создают меньше ошибок, добавляют гибкости и помогают убираться по воскресеньям. Ну, насчет уборки я, конечно, загнул, но согласитесь: представления – это круто, и нужно быть сумасшедшим, чтобы не&lt;br /&gt;
использовать их в своей работе.&lt;/div&gt;</description>
			<pubDate>Sat, 22 Mar 2008 14:58:08 GMT</pubDate>			<dc:creator>Seafox</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF78:PHP</comments>		</item>
	</channel>
</rss>